if(typeof(BCNTRY) == 'undefined') { BCNTRY = {}; }
if(typeof(BCNTRY.sc) == 'undefined') { BCNTRY.sc = {}; }

BCNTRY.sc.Buffer = function(s, name, cfg) { this.init(s, name, cfg); };
BCNTRY.sc.Buffer.prototype = {

	TEMPLATE_LINKS_PROP: 28,

	init: function(s, name, cfg) {
		this.s = s;
		this.name = name;
		this.clear();

		//set cfg defaults
		if(typeof(this.cfg) == 'undefined') { this.cfg = {}; }
		this.cfg.sendOnUnload = false;

		//load custom cfg
		this.loadCfg(cfg);

		//attach unload handler
		YAHOO.util.Event.addListener(window, 'unload', this.handleUnload, this, true);
	},

	clear: function() {
		this._events = {};
		this._eVars = {};
		this._props = {};
	},

	loadCfg: function(cfg) {
		for(var key in cfg) {
			this.cfg[key] = cfg[key];
		}
	},

	addEvent: function(evtNum, preventDuplicates) {
		if(typeof(this._events[evtNum]) != 'undefined' && !preventDuplicates) {
			this._events[evtNum]++;
		} else {
			this._events[evtNum] = 1;
		}
	},

	setEVar: function(num, value) {
		this._eVars[num] = value;
	},

	setProp: function(num, value) {
		this._props[num] = value;
	},

	serialize: function() {
		return YAHOO.lang.JSON.stringify({
			cfg: this.cfg,
			events: this._events,
			eVars: this._eVars,
			props: this._props
		});
	},

	deserialize: function(str) {
		var obj = YAHOO.lang.JSON.parse(str);
		this.cfg = obj.cfg;
		this._events = obj.events;
		this._eVars = obj.eVars;
		this._props = obj.props;
	},

	setLinkTrackVars: function() {
		var vars = [];
		if(this.s.events) { vars.push('events'); }
		if(this.s.products) { vars.push('products'); }
		for(var eVarNum in this._eVars) { vars.push('eVar' + eVarNum); }
		for(var propNum in this._props) { vars.push('prop' + propNum); }
		if(vars.length > 0) { this.s.linkTrackVars = vars.join(','); }
	},

	setEVars: function() {
		for(var eVarNum in this._eVars) {
			this.s['eVar' + eVarNum] = this._eVars[eVarNum];
		}
	},

	setProps: function() {
		for(var propNum in this._props) {
			this.s['prop' + propNum] = this._props[propNum];
		}
	},

	setEventVars: function() {
		var events = [];
		var duplicateEvents = [];
		for(var evtNum in this._events) {
			events.push('event' + evtNum);
			if(this._events[evtNum] > 1) {
				duplicateEvents.push('event' + evtNum + '=' + this._events[evtNum]);
			}
		}
		if(events.length > 0) {
			this.s.linkTrackEvents = events.join(',');
			this.s.events = events.join(',');
			if(duplicateEvents.length > 0) {
				this.s.products = ';;;;' + duplicateEvents.join('|');
			}
		}
	},

	hasDataToSend: function() {
		for(var evtNum in this._events) { return true; }
		for(var eVarNum in this._eVars) { return true; }
		for(var propNum in this._props) { return true; }
		return false;
	},

	send: function() {
		if(!this.hasDataToSend()) { return; }
		if(typeof(clearVars) != 'function') {
			throw 'function clearVars() is not defined';
		}
		clearVars('', this.s);
		this.setEVars();
		this.setProps();
		this.setEventVars();
		this.setLinkTrackVars();
		this.s.tl(this, 'o', this.name);
		this.clear();
	},

	handleUnload: function(evt) {
		if(this.cfg.sendOnUnload) {
			this.send();
		}
	}
};

BCNTRY.sc.ODATCommBuffer = function(s, name, cfg) {
	if(typeof(this.cfg) == 'undefined') { this.cfg = {}; }
	this.cfg.ir_form_id = '';
	BCNTRY.sc.ODATCommBuffer.superclass.constructor.call(this, s, name, cfg);
	this.voteState = this.VOTE_STATE_NONE;
	this.setEVar(this.VOTE_STATE_EVAR, this.voteState);
};
YAHOO.lang.extend(BCNTRY.sc.ODATCommBuffer, BCNTRY.sc.Buffer,  {

	THUMBS_UP_EVENT: 30,
	THUMBS_DOWN_EVENT: 31,
	COMMENTS_ON_EVENT: 32,
	COMMENTS_OFF_EVENT: 33,

	THUMBS_EVAR: 30,
	COMMENTS_EVAR: 31,
	VOTE_STATE_EVAR: 32,
	REAL_NAME_EVAR: 33,

	ODAT_IR_FORM_ABANDON_PROP: 17,

	VOTE_STATE_NONE: 'none',
	VOTE_STATE_HELPFUL: 'yes',
	VOTE_STATE_NOT_HELPFUL: 'no',
	VOTE_STATE_BOTH: 'both',

	trackInstantReviewFormSubmitted: function(isThumbsUp, isRealName) {
		//Track % thumbs up/down
		this.addEvent(isThumbsUp ? this.THUMBS_UP_EVENT : this.THUMBS_DOWN_EVENT);
		this.setEVar(this.THUMBS_EVAR, 'odat_thumbs_' + (isThumbsUp ? 'up' : 'down'));

		//Track real name
		this.setEVar(this.REAL_NAME_EVAR, (isRealName ? 'real' : 'fake') + ' name');
	},

	trackToggleComments: function(isOn) { 
		this.addEvent(isOn ? this.COMMENTS_ON_EVENT : this.COMMENTS_OFF_EVENT);
		this.setEVar(this.COMMENTS_EVAR, 'comment bubbles ' + (isOn ? 'on' : 'off'));
	},

	_tabIdToShortNameMap: {
		'dealTalk_tab': 'dt',
		'features_tab': 'ft',
		'sizing_tab': 'st',
		'reviews_tab': 'rt'
	},

	trackTabSwitch: function(tab) {
		if(this._tabIdToShortNameMap[tab]) {
			tab = this._tabIdToShortNameMap[tab];
		}
		var newVal = 'home:' + tab;
		if(this._props[this.TEMPLATE_LINKS_PROP]) {
			newVal = this._props[this.TEMPLATE_LINKS_PROP] + ',' + newVal;
		}
		this.setProp(this.TEMPLATE_LINKS_PROP, newVal);
	},

	handleHelpfulVote: function(isHelpful) {
		if(this.voteState == this.VOTE_STATE_NONE) {
			this.voteState = isHelpful ? this.VOTE_STATE_HELPFUL : this.VOTE_STATE_NOT_HELPFUL;
		} else if((this.voteState == this.VOTE_STATE_HELPFUL && !isHelpful) || (this.voteState == this.VOTE_STATE_NOT_HELPFUL && isHelpful)) {
			this.voteState = this.VOTE_STATE_BOTH;
		}
		this.setEVar(this.VOTE_STATE_EVAR, this.voteState);
	},

	checkFormAbandonment: function() {
		//determine if the form is actually abandoned
		if(this._events[this.THUMBS_UP_EVENT] || this._events[this.THUMBS_DOWN_EVENT]) { return; }

		var fields;
		var blankFields = [];
		var frm = document.getElementById(this.cfg.ir_form_id);
		if(frm.status.value == 'new') {
			fields = ['isThumbsUp','reviewComment','firstName','lastName','screenName','mv_username','mv_password'];
		}
		else if(frm.status.value == 'returning') {
			fields = ['isThumbsUp','reviewComment','mv_username','mv_password'];
		}
		else if(frm.status.value == 'logged_in') {
			fields = ['isThumbsUp','reviewComment'];
		}
		else {
			throw('Unknown status: ' + frm.status.value);
		}
		for(var i in fields) {
			f = frm[fields[i]];
			if(f.type.match(/^(text|password|textarea|hidden)$/i)) {
				if(f.value.length === 0 || (!f.type.match(/hidden/i) && f.value == f.defaultValue)) {
					blankFields.push(f.name);
				}
			}
			else {
				throw('Unknown field type: ' + f.type);
			}
		}
		if(fields.length > blankFields.length) {
			blankFields.sort(); //make it easier to search through data in omniture
			this.setProp(this.ODAT_IR_FORM_ABANDON_PROP, blankFields.join(',') || 'nonsubmission');
		}
	},

	handleUnload: function(evt) {
		this.checkFormAbandonment();
		BCNTRY.sc.ODATCommBuffer.superclass.handleUnload.call(this, evt);
	}
});
