/*
 * Competitions JavaScript library
 * 
 */


var CoinksCompetition = function(data){
    var _this = this;
	_this.bindData(data);
	
	// defaults
	
	if (!_this.total_entries) _this.total_entries = 0;
	
	_this.buyEntriesFormDisabled = false;
	
	_this.log(_this);
}

CoinksCompetition.MAX_ODDS_FOR_DISPLAY = 10000;

// CoinksCompetition.prototype = new CoinksBase();

CoinksCompetition.prototype.log = function(msg){
    try{
	console.log(msg);		
    } catch(e){
	// do nothing, maybe alert ?
    }
}

CoinksCompetition.prototype.updatePoints = function(){
    var url = '/ajax_update_points/';
    var callback = function(data){
	$('span#acct_pts').text(data.mypoints);
	$('span#acct_pts').show();
    }
    $.get(url, null, callback, "json");    
}

/*
Binds JSON data to member variables.
*/
CoinksCompetition.prototype.bindData = function(data){
    var _this = this;
    for (key in data){
	var value = data[key];
	if (value != null && value != undefined){
	    _this[key] = value;
	}		
    }	 
}

CoinksCompetition.prototype.isNumeric = function(str){
    //  check for valid numeric strings	
    var validChars = "0123456789";
    var length = str.length;
    if (length==0) return false;
    for (var i=0; i<length; i++){
	var chr = str.charAt(i);
	if (validChars.indexOf(chr) == -1){
	    return false;
	}
    } 	
    return true;
}


/*
 * Gets default AJAX params
 */
CoinksCompetition.prototype.getParams = function(extraParams){
	var _this = this;
	var params = {};
	if (_this.campaign){
		params.campaign = _this.campaign;
	}	
	for (param in extraParams){
		params[param] = extraParams[param];
	}
	return params;
}

CoinksCompetition.prototype.confirmEnterCompetition = function(){
	var _this = this;

	$('#competition_detail').hide();
    $('#competition_loading').show();
		
	var callback = function(response){

		if (response.redirect_url){
			window.location.href = response.redirect_url;
			return;
		}
		
        if (response.form){
            $('#competition_loading').hide();
            $('#competition_detail').show();
            $('#competition_form_content').html(response.form);
        } else {

		    _this.bindData(response);
		    _this.updatePage();	
		    $('#enter_competition_btn').hide();
		    $('.enter_competition_btn').hide();
		    $('#buy_entries_form_btn').show();
		    $('#competition_loading').hide();
		    $('#competition_detail').html(response.html).show();			
	    }
    }


    if (_this.data_capture){
        var params = $('#competition_form').serialize();
    } else {
        var params = _this.getParams();
    }
	var url = '/competitions/' + _this.competition_id + '/enter/confirm/';
	$.post(url, params, callback, "json");
}

CoinksCompetition.prototype.cancelEnterCompetition = function(){
	var _this = this;
	_this.getCompetitionDetail();
}

CoinksCompetition.prototype.enterCompetition = function(){
	var _this = this;

	$('#competition_help').hide();
	$('#competition_detail').hide();
    $('#competition_loading').show();

		
	var callback = function(response){
		if (response.redirect_url){
			window.location.href = response.redirect_url;
			return;
		}

        _this.data_capture = response.data_capture;

		$('#competition_loading').hide();
		$('#competition_detail').html(response.html).show();			
		$('#confirm_enter_competition_btn').click(function(){ _this.confirmEnterCompetition();});
		$('#cancel_enter_competition_btn').click(function(){ _this.cancelEnterCompetition();});
	}

	var url = '/competitions/' + _this.competition_id + '/enter/';

    var params = _this.getParams();
    $.get(url, params, callback, "json");
}


/*
Updates the various bits and pieces of the page with current state.
*/
CoinksCompetition.prototype.updatePage = function(){
	var _this = this;	

	_this.updatePoints();	
	var entries = totalEntries = 0;
	if (_this.is_entered){
		entries = _this.entries;
		totalEntries = _this.total_entries;
	} else {
		entries = 1;
		totalEntries = _this.total_entries + 1;
	}
	
	var diffOdds = _this.calcOdds(entries, totalEntries);
    if (diffOdds > CoinksCompetition.MAX_ODDS_FOR_DISPLAY){
       $('#not_is_entered_text').hide(); 
       $('#is_entered_text').hide(); 
       $('#odds_calculator').hide();
    } else {
	    var odds = "1 in " + diffOdds;
	    $('.odds').html(odds);

        if (_this.is_entered==true){
            $('#is_entered_text').show();
            $('#not_is_entered_text').hide();
            $('#spent_points').html(_this.points_spent);
            $('#current_entries').html(_this.entries);
            $('#odds_calculator').show();
        } else {
            $('#is_entered_text').hide();
            $('#not_is_entered_text').show();
            $('#odds_calculator').hide();
        }
    }

	$('#buy_entries_points').val("");
	$('#buy_entries_entries').val("");

	$('#buy_entries_odds').html(odds);
	$('#buy_entries_odds').show();	
	
	$('#rightpanel_header').show();
}

CoinksCompetition.prototype.getCompetitionDetail = function(){
	var _this = this;
	$('#competition_help').hide();	
	$('#competition_detail').html(_this.competitionDetailHtml);
	$('#competition_detail').show();
}

CoinksCompetition.prototype.cancelBuyEntries = function(confirm){
	var _this = this;
	$('#buy_entries_form').hide();
	_this.getCompetitionDetail();
}

CoinksCompetition.prototype.showBuyEntriesForm = function(){
    var _this = this;
	
	if(_this.buyEntriesFormDisabled) return;
	
	$('#competition_detail').hide();
	$('#competition_help').hide();
	$('#buy_entries_form').show();
		
}

CoinksCompetition.prototype.showHelp = function(){
	var _this = this;
	
	$('#competition_help').show();
	$('#buy_entries_form').hide();
	$('#competition_detail').hide();	
	
}

CoinksCompetition.prototype.hideHelp = function(){
	
	var _this = this;
	
	_this.getCompetitionDetail();

	$('#help_btn').click(function(){ 
		_this.showHelp();
		return false;
	});
	
	
}

CoinksCompetition.prototype.buyEntries = function(){
	var _this = this;
	
	var points = $('#buy_entries_points').val();
	
	if (_this.points_extra_entry){
		if (points < _this.points_extra_entry){
			var msg = "<b>You need to enter at least " + _this.points_extra_entry + " points</b>"
			$('#buy_entries_validation').
				html(msg).
				css({'color':"red"}).
				addClass("small").
				show();
			return;
		}
	}

	$('#buy_entries_validation').hide();
	
	if (!points) return;

	if (!_this.isNumeric(points)){
		$('#buy_entries_validation').
			text("enter a valid number").
			css({'color':'red'}).
			addClass("small").
			show();
		return;
	}

    $('#buy_entries_form').hide();
	$('#competition_help').hide();	
	$('#competition_detail').hide();
	$('#competition_loading').show();
	
	_this.buyEntriesFormDisabled = true;
	
	var callback = function(response){
		_this.bindData(response);
		_this.updatePage();
		$('#competition_loading').hide();
		$('#competition_detail').html(response.html).show();
		_this.buyEntriesFormDisabled = false;
	}

	var url = '/competitions/' + _this.competition_id + '/buy_entries/';

	var params = _this.getParams({ 
		points : points
	});
	
	$.post(url, params, callback, "json");
}

/*
Returns odds x as "1 in x" chance
*/
CoinksCompetition.prototype.calcOdds = function(entries, totalEntries){
	var _this = this;
	// calculate percentage
			
	if (_this.num_entrants < 2 && _this.is_entered)
		return 1;

	if (entries < 1 || totalEntries < 1) entries = 1;
	odds = (entries / totalEntries) * 100;
	//odds = odds.toFixed(5);
	// calculate the diff odds
	diff_odds = 100/odds
	// show 2 decimal points if less than 10
	if ((diff_odds < 10) && (diff_odds % diff_odds > 0)){
		diff_odds = diff_odds.toFixed(2);
	} else {
		diff_odds = diff_odds.toFixed(0);
	}
	return diff_odds;
	
}


CoinksCompetition.prototype.oddsCalculator = function(){
	var _this = this;
	
	$('#calc_entries_validation').hide();
	$('#calc_entries_entries').val("");
	
	var points = $('#calc_entries_points').val();	
	if (!points) {
		var odds = $('.odds').html();
		$('#calc_entries_odds').val(odds);
		return;
	}		
	
	if (!_this.isNumeric(points)){
		$('#calc_entries_validation').
			text("enter a valid number").
			css({'color':"red"}).
			addClass("small").
			show();
		return;
	}
	
	var entries = _this.points_multiplier * points;
	var newOdds = 0;
	
	if (_this.num_entrants > 0){
		newOdds = _this.calcOdds(_this.entries + entries, 
			                     _this.total_entries + entries); 
	}
	
	if (newOdds > 0){
		text = "1 in " + newOdds;
	} else {
		text = "1 in 1"
	}
	$('#calc_entries_odds').html(text);
	$('#calc_entries_entries').val(entries);

}

CoinksCompetition.prototype.buyEntriesOddsCalculator = function(){
	var _this = this;
	
	$('#buy_entries_validation').hide();
	$('#buy_entries_additional_entries').val("");
	
	var points = $('#buy_entries_points').val();	
	if (!points) {
		var odds = $('.odds').html();
		$('#buy_entries_odds').html(odds);
		return;
	}		
	
	if (!_this.isNumeric(points)){
		$('#buy_entries_validation').
			text("enter a valid number").
			css({'color':"red"}).
			addClass("small").
			show();
		return;
	}
	
	$('#buy_entries_results').show();
	
	if (points > _this.user_points){		
		var pointsDiff = points - _this.user_points;
		var msg = "<b>You need " + pointsDiff + " points</b>"
		$('#buy_entries_validation').
			html(msg).
			css({'color':"red"}).
			addClass("small").
			show();
		return;
	}
	
	if (_this.points_extra_entry){
		if (points < _this.points_extra_entry){
			var msg = "<b>You need to enter at least " + _this.points_extra_entry + " points</b>"
			$('#buy_entries_validation').
				html(msg).
				css({'color':"red"}).
				addClass("small").
				show();
			return;
		}
		else {
			var use_points = points - (points % _this.points_extra_entry);
			var entries = use_points / _this.points_extra_entry;
		}
	}
	else{
		var entries = _this.points_multiplier * points;
	}
	
	var newOdds = 0;
	
	if (_this.num_entrants > 0){
		newOdds = _this.calcOdds(_this.entries + entries, 
			                     _this.total_entries + entries); 
	}
	
	if (newOdds > 0){
		text = "1 in " + newOdds;
	} else {
		text = "1 in 1"
	}
	$('#buy_entries_odds').text(text);
	$('#buy_entries_additional_entries').text(entries);

}

/*
Sets up the various page events. Call in $(document).load() for 
example.
*/
CoinksCompetition.prototype.initialize = function(){
	var _this = this;
	
	_this.updatePage();
	
	$('#enter_competition_btn').click(function(){
		_this.enterCompetition();
		return false;
	});

	$('.enter_competition_btn').live('click', function(){
        _this.log("comp entered");
		_this.enterCompetition();
		return false;
    });

	$('#buy_entries_form_btn').click(function(){
		$('#buy_entries_form_btn').hide();
		_this.showBuyEntriesForm();
		return false;
	});	

	$('.buy_entries_cancel_btn').click(function(){
		_this.cancelBuyEntries();
		return false;
	});	

	$('#buy_entries_btn').click(function(){
		_this.buyEntries();
		$('#buy_entries_form_btn').show();
		return false;
	});	

	$('#help_btn').click(function(){
		_this.showHelp();
		return false;
	});

	$('#close_help_btn').click(function(){
		_this.hideHelp();
		return false;
	});

	$('#calc_entries_points').keyup(function(){
		_this.oddsCalculator();
		return false;
	});	

	$('#buy_entries_points').keyup(function(){
		_this.buyEntriesOddsCalculator();
		return false;
	});	

	_this.competitionDetailHtml = $('#competition_detail').html();
	
	
}
	
	
 
