Practice = function(){
	return {
		filter : {order: 'level'},
		init : function(config){
			this.role = config.role;
			this.filterValue = config.filter || {};
			var self = this;
			$('#tabs li').click(function(){
				self.tab(this);
			})

			$.get("/rest/drill.php", {order: 'level'}, function(data){
				self.drills = {};
				for(var i=0; i<data.drill.length; i++){
					self.drills[data.drill[i].id] = data.drill[i];
				}

				if('player' == self.role){
					self.tab('add');
				} else {
					self.tab('view');
				}
			}, "json");
		},
		
		updateMenu : function(data){
			var html = '';
			var level = -1;
			html += "<option value=\"\">Select a drill:</option>";
			for(var i=0; i<data.drill.length; i++){
				if(level != data.drill[i].level){
					level = data.drill[i].level;
					html += "<option value=\"\"></option>";
					if(level == 0)
						html += "<option value=\"\">--- Free Throw Drills --------------</option>";
					else
						html += "<option value=\"\">--- Phase "+level+" Drills --------------</option>";
				}
				html += '<option value="'+data.drill[i].id+'">'+data.drill[i].title+'</option>';
			}
			
			$('#drillMenu').html(html);
		},
		
		changeDrill : function(el){
			if(el.value){
				$.get("/rest/drill.php", {id: el.value}, function(data){
					$('#level').attr('class','level'+data.drill[0].level);
					$('#practiceform h3').html('<div id="level" class="level'
						+ data.drill[0].level + '"></div>' 
						+ data.drill[0].title);
					$('#description').html(data.drill[0].description);
					$('#practiceform').show();
				}, "json");
			} else {
				$('#practiceform').hide();
			}
		},
		
		changeCategory : function(el){
			var self = this;
			if(el.value !== undefined){
				this.filter.category_id = el.value;
				$.get("/rest/drill.php", this.filter, function(data){
					self.updateMenu(data);
				}, "json");
			} else {
				$('#practiceform').hide();
			}
		},
		
		changeSection : function(el){
			var self = this;
			if(el.value !== undefined){
				if("1-8" == el.value){
					this.filter.twoPointer = true;
					delete this.filter.threePointer;
					delete this.filter.section;
				} else if("9-15" == el.value){
					this.filter.threePointer = true;
					delete this.filter.twoPointer;
					delete this.filter.section;
				} else {
					delete this.filter.threePointer;
					delete this.filter.twoPointer;
					this.filter.section = el.value;
				}
				this.filter.section = el.value;
				$.get("/rest/drill.php", this.filter, function(data){
					self.updateMenu(data);
				}, "json");
			} else {
				$('#practiceform').hide();
			}
		},
		
		clearForm : function(){
			$('#made').val('');
			$('#attempted').val('');
			$('#time').val('');
		},
		
		createFilters : function(filter){
			if(!Practice.filters){
				var list = [
					{ 
						name: 'category'
						,param: 'drill_category_id'
						,label: 'Drill Type'
					}
					,{ 
						name: 'section'
						,param: 'drill_section'
						,data: [
							[0,'Free Throw']
							,['2PT','1-8 (2PT)']
							,['3PT','9-15 (3PT)']
							,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
						]
						,expandData: true
						,label: 'Section'
					}
					,{ 
						name: 'drill'
						,label: 'Drill'
						,param: 'drillId'
						,baseParams: {order: 'level'}
						,renderValue: function(o){ 
							if(o.level != 0) return '['+o.level+'] '+o.title;
							else return o.title;
						}
					}
				];
				if('coach' == this.role || 'subcoach' == this.role){
					list.splice(0,0,{ 
						name: 'player' 
						,label: 'Player'
						,param: 'playerId'
						,renderValue: function(o){ return o.firstName+' '+o.lastName; }
					});
				}
				
				Practice.filters = new FilterSet({
					container: 'filters'
					,header: 'Filter Practice Results By:'
					,filter : filter || {playerId: ''}
					,filterList: list
					,change: function(vals){
						var deepCopy = {};
						for (var x in vals) if (!Object.prototype[x]) {
							if('drill_section' == x && vals[x] == '2PT')
								deepCopy.drill_twoPointer = 1;
							else if('drill_section' == x && vals[x] == '3PT')
								deepCopy.drill_threePointer = 1;
							else
								deepCopy[x] = vals[x];
						}
					
						Practice.list(deepCopy);
					}
				});
				Practice.filters.init();
			}
		},
		
		save : function(){
			var date = $('#date').val();
			var parts = date.split(/\//);
			if(parts.length == 3){
				date = parts[2]+'-'+parts[0]+'-'+parts[1];
			}
			
			var result = {
				date: date
				,made: $('#made').val()
				,attempted: $('#attempted').val()
				,time: $('#time').val()
				,drillId: $('#drillMenu').val()
			};
			
			var self = this;
			$.post("/rest/drillResult.php", { json: JSON.stringify(result) },
			  function(data){
				if (data){
			  		self.clearForm();
					$('#message').html('Practice results logged successfully.').removeClass('error').fadeIn("fast");
					window.setTimeout(function(){
						$('#message').fadeOut("slow");
					},2000);
				} else {
					$('#message').html('Error logging practice results.  Please check your entry and try again.').addClass('error').fadeIn("fast");
				}
			  }, "text");
		},
		
		renderDrill : function(id){
			return this.drills[id] ? this.drills[id].title : 'Drill #'+id;
		},
		
		list : function(p){
			var self = this;
			p.dc = new Date().getTime();
			p.order = "date desc";
			$.get("/rest/drillResult.php", p, function(data){
				var fg = 0, two = 0, three = 0, fgAtt = 0, threeAtt = 0, twoAtt = 0;
				r = '<table width="100%">'
					+'<tr>'
					+'<th>Drill</th>'
					+'<th class="sort-numeric">Date</th>'
					+'<th class="sort-numeric">Made</th>'
					+'<th class="sort-numeric">Attempted</th>'
					+'<th class="sort-numeric">Percentage</th>'
					+'<th class="sort-numeric">Time</th>'
					+'</tr>';
				if(data.drillResult && data.drillResult.length){
					var atts = 0; 
					var makes = 0;
					var pcts = [];
					var dates = [];
					for(var i=0; i<data.drillResult.length; i++){
						var d = data.drillResult[i];
						var pct = d.attempted ? Math.round(100*d.made/d.attempted) : 0;
						atts += d.attempted/1;
						makes += d.made/1;
						date = util.renderDate(d.date);
						pcts.splice(0,0,pct);
						dates.splice(0,0,date);
						r += '<tr class="'
						 	+ (i%2 ? 'odd ' : '') 
							+ '">'
							+'<td>'+self.renderDrill(d.drillId)+'</td>'
					 		+'<td>'+date+'</td>'
							+'<td>'+d.made+'</td>'
							+'<td>'+d.attempted+'</td>'
							+'<td>'+ (d.attempted ? Math.round(100*d.made/d.attempted)+'%' : '-')+'</td>'
							+'<td>'+(d.time == '00:00:00' ? '--' : d.time.replace(/OO:/,''))+'</td>'
						+'</tr>';
					}
					
					self.chart(pcts, (dates.length > 0 ? [dates[0],dates[dates.length-1]] : []));
					/*
					var makepct = atts ? Math.round(100*makes/atts) : 0;
					var misspct = 100-makepct;
					self.pie([makepct,misspct],['Made','Missed']);
					*/
				
					var tot = atts ? Math.round(100*makes/atts) : 0;
					var html = '<div class="bigstats">'
						+' TOTAL: <span>'+(tot ? tot : '-')+'%</span> <em>('+makes+'/'+atts+')</em>'
						+'</div>';
					$('#chart').append(html);
				} else {
					r += '<tr><td colspan="5">No results to display.</td></tr>';
					$('#chart').html('');
				}
				r += '</table>';
				
				/*
				if(fgAtt){
					var stats = '<div class="bigstats">'
						+'2PT %: <span>'+(twoAtt > 0 ? Math.round(two/twoAtt*100) : ' - ')+'</span>'
						+' 3PT %: <span>'+(threeAtt > 0 ? Math.round(three/threeAtt*100) : ' - ')+'</span>'
						+'</div>';
					$('#stats').html(stats);
				}*/
				
				$('#list').html(r);
				var s = new Sortable('list');
				
			}, "json");
		},
		
		chart: function(data,labels){
			var p = {
				cht: 'lc'
				,chco : 'ff9933,000000'
				,chs: '250x100'
				,chd: 't:'+data.join(',')
				,chxt: 'y'+(labels ? ',x' : '')
				,chxl:'0:||50%|100%'+(labels ? '|1:|'+labels.join('|') : '')
				,chm:'B,ff9933,0,0,0'
			}
			$('#chart').html('<img src="'+Chart.url(p)+'"/>');
		},
		
		pie: function(data,labels){
			var p = {
				cht: 'p3'
				,chco : 'AAFFAA,FFAAAA'
				,chs: '250x100'
				,chl: labels.join('|')
				,chd: 't:'+data.join(',')
			}
			$('#chart').append('<img src="'+Chart.url(p)+'"/>');
		},
		
		tab : function(t){
			el = t.tagName ? $(t) : $('#tab-'+t);
			$("#tabs .active").removeClass("active");
			el.addClass("active");

			var id = el.attr("id").replace(/tab-/,'');
			$('.filter').hide();
			$('#filter-'+id).show();
			
			
			if(id == 'view'){
				Practice.createFilters(this.filterValue);
				Practice.list(this.filters ? this.filters.values : {});
				$('#shotchart-example').hide();
			} else {
				$('#shotchart-example').show();
			}
		}
	};
}();