/**
 * @author khayden
 */
var oConn = null;
//var iPinMinLen = 10;
var bRedeemClicked = false;

// change by kmdavis
var oPinValRules = new Array();
oPinValRules[0] = new Object();
oPinValRules[0].name = "Incomm";
oPinValRules[0].minlen = 10;
oPinValRules[0].maxlen = 10;
oPinValRules[0].prefix = "";
oPinValRules[0].postfix = "";
oPinValRules[0].validchars = "0-9";
oPinValRules[1] = new Object();
oPinValRules[1].name = "Blackhawk";
oPinValRules[1].minlen = 15;
oPinValRules[1].maxlen = 15;
oPinValRules[1].prefix = "816";
oPinValRules[1].postfix = "";
oPinValRules[1].validchars = "0-9a-zA-Z";

var oRedeem = new Object();
oRedeem.oForm = null;
oRedeem.code = -1;
oRedeem.message = "";
oRedeem.zbucks = 0;
oRedeem.rewards = new Object();
oRedeem.rewards.id = -1;
oRedeem.rewards.owned = "";
oRedeem.rewards.items = new Array();

function Redeem( oForm )
{
	if ( bRedeemClicked ){ return false; }
	else { bRedeemClicked = true; }
	ShowWaitingDialog();
	DEBUG("Redeem: oForm = " + oForm);
	oRedeem.oForm = oForm;
	var pin = oForm.elements['pin'].value;
	
	if ( pin == null || pin == undefined  ){
		ShowOops( "Could not validate PIN." );
		return false;
	}
	
	// change by kmdavis
	var bMatchFound = false;
	for(var i=0;i<oPinValRules.length && !bMatchFound; i++)
	{
	  var regexStr = "^"+oPinValRules[i].prefix+"["+oPinValRules[i].validchars+"]";
	  regexStr += "{"+(oPinValRules[i].minlen-(oPinValRules[i].prefix.length+oPinValRules[i].postfix.length));
	  regexStr += ","+(oPinValRules[i].maxlen-(oPinValRules[i].prefix.length+oPinValRules[i].postfix.length))+"}";
	  regexStr += oPinValRules[i].postfix+"$";
	  var regex = new RegExp(regexStr);
	  if(pin.match(regex))
	    bMatchFound = true;
	}
	if(!bMatchFound)
	{
	  ShowOops( "Could not validate PIN." );
	  return false;
	}
	
	// url for ajax request
	var url = "redeem.jhtml?pin="+pin;
	
	// Ajax request
	oConn = new HttpConnect('redeem',url);
	oConn.requestMethod = "post";
	oConn.create();
	oConn.setCallback(RedeemCB);
	oConn.execute();
	
	DEBUG("Redeem: return false");
	return false;
}

function RedeemCB()
{
	var requestObj = oConn.request;
	DEBUG("RedeemCB: readyState = " + requestObj.readyState);
	if ( requestObj.readyState == 4 ){
		DEBUG("RedeemCB: requestObj.status = " + requestObj.status);
		//if ( requestObj.status == 500 ){ GenericError(); }
		if ( requestObj.status != 200 ){ oRedeem.code = -1; CheckStatus(); return false; }
		DEBUG("RedeemCB: xml = " + requestObj.responseText);//requestObj.responseText
		ParseResponse(requestObj.responseXML);
	}
}

function ParseResponse( oXmlDoc )
{
	var firstNode = oXmlDoc.getElementsByTagName("response")[0];
	var status = firstNode.getElementsByTagName("status")[0];
	oRedeem.code = status.getAttribute("code");
	oRedeem.message = status.getAttribute("message");
	var zbucks = firstNode.getElementsByTagName("zbucks")[0];
	
	oRedeem.zbucks = ( navigator.userAgent.toLowerCase().indexOf("msie") > -1 ) ? zbucks.text : zbucks.textContent;
	
	//DEBUG("ParseResponse: zbucks.innerText = " + zbucks.innerText);
	//DEBUG("ParseResponse: zbucks.innerHTML = " + zbucks.innerHTML);
	//DEBUG("ParseResponse: zbucks.text = " + zbucks.text);
	//DEBUG("ParseResponse: zbucks.textContent = " + zbucks.textContent);
	
	var rewards = firstNode.getElementsByTagName("rewards")[0];
	oRedeem.rewards.id = rewards.getAttribute("id");
	var items = rewards.childNodes;
	//DEBUG("ParseResponse: items = " + items);
	//DEBUG("ParseResponse: items.length = " + items.length);
	for ( var idx=0; idx < items.length; idx++ ){
		if ( items[idx].nodeName != "reward" ){ continue; }
		//DEBUG("ParseResponse: items["+idx+"].nodeName = " + items[idx].nodeName);
		//DEBUG("ParseResponse: items["+idx+"] = " + items[idx]);
		//DEBUG("ParseResponse: items["+idx+"].nodeType = " + items[idx].nodeType);
		//DEBUG("ParseResponse: typeof(items["+idx+"]) = " + typeof(items[idx]));
		var attr = items[idx].attributes;
		//DEBUG("ParseResponse: attr.length = " + attr.length );
		var itemIdx = oRedeem.rewards.items.length;
		oRedeem.rewards.items[itemIdx] = new Object();
		//DEBUG("ParseResponse: itemIdx = " + itemIdx );
		for ( var adx=0; adx < attr.length; adx++ ){
			var key = attr[adx].name;
			var val = attr[adx].value;
			//DEBUG("ParseResponse: attr["+adx+"] "+key+" = " + val );
			if ( key == "owned" ){ oRedeem.rewards.items[itemIdx].isowned = ( val == "true" ); }
			if ( key == "name" ){ oRedeem.rewards.items[itemIdx].name = val; }
			if ( key == "id" ){ oRedeem.rewards.items[itemIdx].id = val; }
			if ( key == "new" ){ oRedeem.rewards.items[itemIdx].isnew = ( val == "true" ); }
			if ( key == "type" ){ oRedeem.rewards.items[itemIdx].type = val; }
			
		}
	}
	
	CheckStatus();
	
}

/*
    0: SUCCESS
    1: CARD_SUSPENDED
    2: CARD_PENDING
    3: CARD_DEACTIVATED
    4: CARD_REDEEMED
    5: CARD_EXPIRED
    6: INVALID_CARD
    7: INVALID_REQUEST
    8: AWARD_SERVICE_FAILED
    9: SYSTEM_ERROR
*/
function CheckStatus()
{
	DEBUG("CheckStatus: oRedeem.code = " + oRedeem.code);
	switch ( parseInt(oRedeem.code) ) {
		case 0:
			ShowCongrats();
			break;
		case 4:
			ShowOops("The PIN code you entered has already been redeemed. <br />Please enter another valid PIN code not previously entered to add ZBucks to your ZCard.");
			break;
		case 6:
			ShowOops("Looks like you didn't enter a valid PIN code. <br />Please check your Zwinky gift card and carefully enter the PIN again. Thanks!");
			break;
		default:
			ShowOops("We are experiencing difficulties processing your gift card PIN number. Please try entering the PIN again at a later time. Thank you.");
			break;
	}
}

function ShowCongrats()
{
	DEBUG("ShowCongrats()");
/*
	http://local.dev.zwinky.com/commerce/redeemCongrats.jhtml?
	cv=2&ni=propeller&nin=Balloons&il=carpet,jetpack&cval=25
	
	10 = 1500
	15 = 2500
	25 = 5000
	
*/
	
	DEBUG("ShowCongrats: oRedeem.zbucks = " + oRedeem.zbucks);
	bRedeemClicked = false;
	var url = "redeemCongrats.jhtml";
	var cv = 1;
	var cval = 10;
	var il = "";
	var ni = -1;
	var nin = "";
	switch ( parseInt(oRedeem.zbucks) ){
		case 5000:
			cv = 2;
			cval = 25;
			break;
		case 2500:
			cv = 2;
			cval = 15;
			break;
	}
	//DEBUG("ShowCongrats: oRedeem.rewards.items.length = " + oRedeem.rewards.items.length);
	for ( var idx=0; idx < oRedeem.rewards.items.length; idx++ ){
		//DEBUG("ShowCongrats: oRedeem.rewards.items["+idx+"].name = " + oRedeem.rewards.items[idx].name);
		//DEBUG("ShowCongrats: oRedeem.rewards.items["+idx+"].id = " + oRedeem.rewards.items[idx].id);
		//DEBUG("ShowCongrats: oRedeem.rewards.items["+idx+"].isnew = " + oRedeem.rewards.items[idx].isnew);
		//DEBUG("ShowCongrats: oRedeem.rewards.items["+idx+"].isowned = " + oRedeem.rewards.items[idx].isowned);
		//DEBUG("ShowCongrats: oRedeem.rewards.items["+idx+"].type.toLowerCase() = " + oRedeem.rewards.items[idx].type.toLowerCase());
		
		//if ( oRedeem.rewards.items[idx].isnew ){ ni = oRedeem.rewards.items[idx].id; nin = escape(oRedeem.rewards.items[idx].name); }
		if ( oRedeem.rewards.items[idx].isnew ){ ni = oRedeem.rewards.items[idx].id; nin = oRedeem.rewards.items[idx].name; }
		if ( oRedeem.rewards.items[idx].isowned ){ il += "," + oRedeem.rewards.items[idx].id; }
		if ( oRedeem.rewards.items[idx].type.toLowerCase() == "pbucks" && oRedeem.rewards.items[idx].isnew ){ ni = "";nin = "pbucks"; }
	}
	
	if ( nin == "pbucks" ){ cv = 3; }
	
	url += "?cv=" + cv + "&cval=" + cval;
	if ( cv == 2 ){
		url += "&ni="+ni+"&nin="+nin+"&il="+il.substr(1)+"";
	}
	
	oRedeem.oForm.elements['cv'].value = cv;
	oRedeem.oForm.elements['cval'].value = cval;
	oRedeem.oForm.elements['ni'].value = ( cv == 2 )? ni : "";
	oRedeem.oForm.elements['nin'].value = ( cv == 2 )? nin : "";
	oRedeem.oForm.elements['il'].value = ( cv == 2 )? il.substr(1) : "";
	
	//DEBUG("ShowCongrats: nin = " + nin);
	//DEBUG("ShowCongrats: url = " + url);
	oRedeem.oForm.submit();
	//window.location.href = url;
}

function ShowOops( sMsg )
{
	//DEBUG("ShowOops: sMsg = " + sMsg);
	HideWaitingDialog();
	bRedeemClicked = false;
	var oopsBox = document.getElementById("oopsBox");
	var oopsMsg = document.getElementById("oopsMsg");
	
	var overlay=document.createElement("DIV");
	overlay.id = 'overlay';
	overlay.innerHTML = "&nbsp;";
	document.body.appendChild(overlay);
	
	//DEBUG("ShowOops: screen dimensions = " + window.screen.width + ", " + window.screen.height);
	//DEBUG("ShowOops: available screen dimensions = " + window.screen.availWidth + ", " + window.screen.availHeight);
	
	if ( oopsBox ){
		oopsBox.style.display = "block";
		oopsBox.style.top = "150px";
	}
	if ( oopsMsg ){
		oopsMsg.innerHTML = sMsg;
	}
}

function CloseOops( id )
{
	var overlay = document.getElementById("overlay");
	var oopsBox = document.getElementById(id);
	try { document.body.removeChild(overlay); } catch(E){}
	try {
		oopsBox.style.display = "none";
	} catch(E){}
}

function ShowWaitingDialog()
{
	try {
		document.getElementById("blackdropPrompt").style.display="block";
		document.getElementById("WaitingBox").style.display = "block";
	} catch(e){}
}

function HideWaitingDialog()
{
	try {
		document.getElementById("blackdropPrompt").style.display="none";
		document.getElementById("WaitingBox").style.display = "none";
	} catch(e){}
}

function ClearPin( oPin )
{
	if ( oPin.value.toLowerCase() == "enter pin code here" ){
		oPin.value = "";
		oPin.style.color = "#000";
	}
}

function launchWardrobe(){
	var launchStr = "HKLM,SOFTWARE\\MyWebSearch\\SkinTools,PlayerPath, Avatar wardrobe";
	
	if(window.ActiveXObject){
		document.getElementById('SettingsControl').Launch(launchStr);
	}else{
		document.getElementById('ToolbarCtlMWS').Launch(launchStr);
	}
	
}//end function

//-- BEGIN: HttpConnect

/*
CLASS: HttpConnect
DESCRIPTION: class constructor
*/

function HttpConnect(name,url){
	this.name = name;
	this.url = url;
	this.request = null;
	this.requestMethod = "GET";
	this.asynchronous = true;
	this.callback;
	this.headers = null;
}//end function HttpConnect

//begin class method definitions for HttpConnect
HttpConnect.prototype = {
	
	// create the request object
	create: function(){
		if ( window.ActiveXObject ){
			try {
				this.request = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					this.request = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (E) {}
			}//end try
		} else if ( window.XMLHttpRequest ){
			this.request = new XMLHttpRequest();
		}//end if
	},
	
	// set the REQUEST_METHOD
	setRequestMethod: function(method){
		this.requestMethod = method;
	},
	
	// set the mime type
	// since this does not work in IE we'll check to see if we can do this
	setMimeType: function(mType){
		if ( window.ActiveXObject ){
			return;
		} else {
			this.request.overrideMimeType(mType);
		}//end if
	},
	
	// set the callback function
	setCallback: function(callback){
		this.callback = callback;
	},
	
	// open the HttpConnect, monitor the state change and run the callback when necessary
	execute: function(){
		this.request.open(this.requestMethod, this.url, this.asynchronous);
		this.request.onreadystatechange=this.callback;
		this.send();
	},
	
	// send request
	send: function(){
		if ( window.ActiveXObject ){
			this.request.send();
		} else {
			this.request.send(null);
		}//end if
	},
	
	// useful methods
	
	// get headers
	headers: function(){
		this.request.open(this.requestMethod, this.url, this.asynchronous);
		this.request.onreadystatechange=function(){
			if ( this.request.readyState == 4 ){
				this.headers = this.request.getAllResponseHeaders();
			}//end if
		}//end anonymous function
		this.send();
	}
};
//end class method definitions for HttpConnect

//-- END: HttpConnect

function DEBUG( msg )
{
	try { console.log(msg);	} catch(E){ }
}
