
function PurchaseBox(purchaseButtonName, realPurchaseEnabled)
{
	this.purchaseButtonName = purchaseButtonName;
	this.realPurchaseEnabled = realPurchaseEnabled;
	this.initCarrierSelect();		
	if (GetCookie('phone-number')) {
		this.validatePhoneNumber(GetCookie('phone-number'));
	} else {
		$('phoneNumber').value = "Enter Mobile Number";
	}
		
	this.makeSureThePurchaseButtonIsInTheRightState;

	this.teamBrandingParameters; // stuff for store branding
}

PurchaseBox.prototype.enterPhoneNumberInput = function () {
	if ($('phoneNumber').value == "Enter Mobile Number") {
		$('phoneNumber').value = "";
	}
}

PurchaseBox.prototype.initPurchase = function () {

	$('purchaseValidationError').innerHTML="";
	
	if (!this.validateCarrierSelect()) {
		this.displayError("Sorry, please select a carrier and try again.");
		return;
	}
	
	if (!$('terms').checked) {
		$('labelTerms').style.display = 'block'; 
	   	$(this.purchaseButtonName).disabled = false;
		this.displayError('Please accept the Terms &amp; Conditions.');
		return;
	}
	
	
	if (this.isMMSCarrier(this.getCarrier()))
		this.sendPIN();
	else 
		this.triggerPurchase();
}



PurchaseBox.prototype.getCarrier = function () {	
	return GetCookie('cookie-carrier');
}


PurchaseBox.prototype.isMMSCarrier = function (carrier) {
	return carrier == 'Verizon';
}

PurchaseBox.prototype.makeSureThePurchaseButtonIsInTheRightState= function () {
  if (this.purchaseButtonName) {
    var buyButton = document.getElementById(this.purchaseButtonName);
 
    if (buyButton) {
      if (this.itemToPurchase) {
        buyButton.disabled=false;
        $('contentInfo').innerHTML = this.itemToPurchase.displayName + "<br />" + "Standard messaging or other charges may apply" + "<br /> $" + this.itemToPurchase.priceAmount;
      } else {       
        buyButton.disabled=true;
        $('contentInfo').innerHTML = "";
      }
    }
  } else {
  	alert('set the purchase button name');
  }
}

//Called when the user changes their device information, to see if the 
// selected preview image is still available.
PurchaseBox.prototype.checkAvailabilityOfItemToPurchase = function() 
{
	if (!this.itemToPurchase)
		return;

    new Ajax.Request('/mlb/ContentService?jsonVar=Content&path=' + this.itemToPurchase.discoveryPath,
    { 	
	    method:'get',
    	onSuccess: function(transport) {
    		eval(transport.responseText);
    		if (typeof Content == 'undefined' || typeof Content.items[0] == 'undefined')
    			this.clearPreview();
    	}.bind(this),
	    onFailure: function(transport) { 	     
		   	 this.clearPreview();
	   	}.bind(this)
	});
}

PurchaseBox.prototype.setTeamBrandingParameters = function(qString) {
	this.teamBrandingParameters = qString;
}

PurchaseBox.prototype.setItemToPurchase = function (item) {
	if (!item) {
		alert('error - item is undefined');
	}
	
	//change the carrier drop down if necessary.. 
	
	if (item.carrierRestrictions_def) {
		this.setUpCarrierDropDown(item.carrierRestrictions_def);
	} else {
//		this.setUpCarrierDropDown("AT&T Mobility,Sprint,T-Mobile,Verizon");
		this.setUpCarrierDropDown("Sprint,T-Mobile,Verizon");
	}
	
	this.itemToPurchase = item;
	this.makeSureThePurchaseButtonIsInTheRightState();
	this.resetPurchaseBox();
	
}

PurchaseBox.prototype.setUpCarrierDropDown = function (carrierList) {
	
	//clear them out
	var oldValue = $('carrierName').value;
	var i=$('carrierName').options.length -1;
	while (i > 0) {
		$('carrierName').removeChild($('carrierName').options[i]);
		i-=1;
	}
	
	//put some back
	var carriers = carrierList.split(",");
	i=0;
	while (i < carriers.length)
	{
		if (carriers.length ==1) {
			var newOption = document.createElement("option");
			newOption.innerHTML = carriers[i] + " Exclusive!";
			newOption.value = carriers[i];
			$('carrierName').appendChild(newOption);
			$('carrierName').value = carriers[i];
			return;
		} else {
			var newOption = document.createElement("option");
			if (carriers[i] == 'Verizon') {
				newOption.innerHTML = "Verizon Wireless";
			} else {
				newOption.innerHTML = carriers[i];
			}
			newOption.value = carriers[i];
			$('carrierName').appendChild(newOption);
		}
		i+=1;
	}
	$('carrierName').value = oldValue;

}

PurchaseBox.prototype.clearItemToPurchase = function (){
	this.itemToPurchase = undefined;
	this.makeSureThePurchaseButtonIsInTheRightState();
}

PurchaseBox.prototype.validateCarrierSelect = function () {
	var selectedCarrier = $('carrierName').value;
	
	if (selectedCarrier == undefined ||
	    selectedCarrier == '') {
	    return false;
	} else {
		SetCookie('cookie-carrier', selectedCarrier, 180, '/mlb/', null, null);
		return true;
	}
}

PurchaseBox.prototype.initCarrierSelect = function () {
	if ($('carrierName') && GetCookie('cookie-carrier')) {
		$('carrierName').value = GetCookie('cookie-carrier');
	}
	// display verizon extras for all carriers - 7/29/2009
	//if ($('carrierName').value == 'Verizon') {
	//	$('verizonExtras').style.display = 'block'; 
	//} else {
	//	$('verizonExtras').style.display = 'none'; 
	//}
}


PurchaseBox.prototype.validatePhoneNumber = function (phoneNumberStr){
	phoneNumberStr = phoneNumberStr.replace(/\D+/g, '');
	if (phoneNumberStr.length != 10) {
		return false;
	} else {
		if (phoneNumberStr.charAt(0) == '1') {
			return false;
		} else {
			if ($('phoneNumber')) {
				$('phoneNumber').value = this.formatPhoneNumber(phoneNumberStr);
			}
			if ($('remember') && $('remember').checked) {
				SetCookie('phone-number', phoneNumberStr, 180, '/mlb/', null, null);
			} else if ($('remember')) { //don't delete it if this form element doesn't exist.
				DeleteCookie ('phone-number','/mlb/',null)
			}
			return true; 
		}
	}
}
PurchaseBox.prototype.formatPhoneNumber= function (phoneNumberStr) 
{
	var phoneNumberStr = phoneNumberStr.replace(/\D+/g, '');
	if (phoneNumberStr.length != 10) {
		return phoneNumberStr;
	} else {
		return phoneNumberStr.replace(/(\d{3})(\d{3})(\d{4})/,'($1) $2-$3')
	}
}

PurchaseBox.prototype.sendPIN = function (){
   
	if (this.validatePhoneNumber($('phoneNumber').value)) {
		$('purchaseBoxSpinner').style.display= 'block';
		new Ajax.Request("/mlb/PINService?contentType=application/json&phoneNumber=001" 
				+ escape($('phoneNumber').value.replace(/\D+/g, '')) 
				+ "&carrierName=" + escape($('carrierName').value) 
				+ "&path=" + escape(this.itemToPurchase.discoveryPath) 	, 
		{
			method: 'get',
			onSuccess: function(data){ 				
				var mydata = eval( "(" + data.responseText + ")" );
				if (mydata.status == true){
					$('purchaseForm').style.display = 'none';
					$('pinFormText').innerHTML = "We have sent a message to<br/>" + $('phoneNumber').value + 
						 " with a PIN number. Enter your PIN below to complete your purchase.";
					$('pinForm').style.display = 'block';	
					$('pinField').value= "";
					$(purchaseButtonName).disabled = false;				
				} else {					
					this.displayError("Sorry, there was an error processing your request. Please try again later. <br />");	
				}				
			}.bind(this),
			onFailure: function(transport) {		
				this.displayError("Sorry, there was an error processing your request. Please try again later. <br />");		
			}.bind(this),
			onComplete: function(transport) {
				$('purchaseBoxSpinner').style.display= 'none';				
			}
		});
		trackClick("/pinrequest",null);
	} else {
	   this.displayError("Sorry, that phone number is invalid. Please try again.");		
	}
}

PurchaseBox.prototype.triggerPurchase = function() {
    $(this.purchaseButtonName).disabled = true;
    
    
	if (this.realPurchaseEnabled) {
		if (this.validatePhoneNumber($('phoneNumber').value)) {			
		
			this.sendPurchaseRequest();
			trackClick("/purchaserequest",null);
		} else {
		    $(this.purchaseButtonName).disabled = false;
			this.displayError('Sorry, that phone number is not valid. Please try again');
		}
	} else {		
		document.location= '/mlb/item.jsp?path=' + this.itemToPurchase.discoveryPath + this.teamBrandingParameters; // add team branding params to redirect so item page is branded
	}
}

PurchaseBox.prototype.updatedCarrier = function ()
{
	if ($('carrierName').value == 'Verizon') {
		$('verizonExtras').style.display = 'block'; 
	} else {
		$('verizonExtras').style.display = 'none'; 
	}
}


PurchaseBox.prototype.updatePhoneNumber = function ()
{
	this.resetPurchaseBox();
}

PurchaseBox.prototype.sendPurchaseRequest= function () {
	$('purchaseBoxSpinner').style.display= 'block';

	new Ajax.Request("/mlb/PurchaseService?contentType=application/json&path=" 
			+ escape(this.itemToPurchase.discoveryPath) 
			+ "&phoneNumber=001" + escape($('phoneNumber').value.replace(/\D+/g, '')) 
			+ "&carrierName=" + escape($('carrierName').value)	, 
		{
			method: 'post',
			onSuccess: function(data){ 				
				var mydata = eval( "(" + data.responseText + ")" );
				if (mydata.status == true){
					$('purchaseForm').style.display = 'none';
					$('pinForm').style.display = 'none';
					$('purchaseMmsDl').style.display = 'none';
					$('purchaseCompleteDiv').style.display = 'block'; 
				} else if (mydata.status == false) {
					$(this.purchaseButtonName).disabled = false;
				    this.displayError("Sorry, there was an error processing your request. Please try again later. <br />");
				}	
				else if (mydata.status == 'blocked') {
					$('pinForm').style.display = 'none';
					$('userBlockedText').style.display = 'block';
					trackClick("/blockedUserPurchaseAttempt",null);
				}	   
			}.bind(this),
			onFailure: function() {
				$(this.purchaseButtonName).disabled = false;
			    this.displayError("Sorry, there was an error processing your request. Please try again later. <br />");
			}.bind(this),
			onComplete: function() {
				$('purchaseBoxSpinner').style.display= 'none';
			}
		});
}

PurchaseBox.prototype.confirmPin = function (pin){
	
	$('purchaseBoxSpinner').style.display= 'block';
	new Ajax.Request("/mlb/PINService?contentType=application/json&pin=" + pin + 
			"&phoneNumber=001" + escape($('phoneNumber').value.replace(/\D+/g, '')) 
			+ "&carrierName=" + escape($('carrierName').value) , 
		{
			method: 'post',
			onSuccess: function(data){ 				
				var mydata = eval( "(" + data.responseText + ")" );
				if (mydata.status == true){
					$('purchaseMmsDl').style.display = 'block';
					$('pinForm').style.display = 'none';
					this.triggerPurchase();
				} else if (mydata.status == false) {
					$('pinFormText').innerHTML = "Sorry, that PIN did not match. Please try again:";
					$('pinField').value="";			
				}
			    $(this.purchaseButtonName).disabled = false;
			}.bind(this),
			onFailure: function() {
			   this.displayError("Sorry, there was an error processing your request. Please try again later. <br />");				
			}.bind(this),
			onComplete: function() {
				 $('purchaseBoxSpinner').style.display= 'none';
			}
		});
	trackClick("/pinconfirm",null);
}

PurchaseBox.prototype.clearPreview = function()
{	
	$('fullSizePreview').src = "";	
	this.displayContentUnavailableError();
	this.clearItemToPurchase();
}

//This error appears in the phone window. TODO create phone.js and move there
PurchaseBox.prototype.displayContentUnavailableError = function()
{
	$('contentUnavailableText').style.display = 'block';
	$('previewText').style.display = 'block';	
	setTimeout(this.clearContentUnavailableError, 8000);
}

PurchaseBox.prototype.clearContentUnavailableError = function()
{
	$('contentUnavailableText').style.display = 'none';
}

PurchaseBox.prototype.displayError = function(errorMsg) {
	$('purchaseError').innerHTML = errorMsg;
	$('purchaseError').style.display = 'block';
	setTimeout(this.clearError, 8000);
	trackClick("/displayError",null);
}

PurchaseBox.prototype.clearError = function()
{
	$('purchaseError').style.display = 'none';
}
PurchaseBox.prototype.clearPurchaseComplete = function()
{
	$('purchaseCompleteDiv').style.display = 'none';
}
PurchaseBox.prototype.resetPurchaseBox = function()
{
	this.clearError();
	this.clearPurchaseComplete();
	$('purchaseForm').style.display = 'block';
	$('pinForm').style.display = 'none';
	$('purchaseMmsDl').style.display = 'none';
	$('userBlockedText').style.display = 'none';
	$('pinField').value="";
}

// form validation

function onPhoneNumberEdit(e)  {

	var keys = getKeyChar(e);
	returnVal = isControlCharacter(keys[0], e) || /[ \d\-().]/.test(keys[1]);
	return returnVal; 
}
function onPINEdit(e) {

	var keys = getKeyChar(e);
	returnVal = isControlCharacter(keys[0], e) || /[\d]/.test(keys[1]);
	return returnVal; 
}
function getKeyChar(e) {

	var key = !e || (!e.which && e.which != 0) ? window.event.keyCode : e.which;
	return [key, String.fromCharCode(key)];
}
function isControlCharacter(key, e) {
	return e.metaKey || e.ctrlKey || key == 63234 || key == 63235 || key == 63272 || key == 9 || key == 8 || key == 0;
}