
function MAC_Facebook(params) {
	this._initialized = false;
	this._fbApiSrc = 'https://connect.facebook.net/en_US/all.js';
	this._fbid = params.fbid;
	this._elements = params.elements;
	this._baseImgUrl = (params.baseImgUrl == undefined ? '/checkout/images/fb/' : params.baseImgUrl);

	this.init = function(params) {
		var body = document.getElementsByTagName('body')[0];
		if (body == null) {
			return;
		}

		window.fbAsyncInit = function() {
			FB.init({
				appId: this._fbid,
				status: true,
				cookie: true,
				xfbml: false
			});

			window.macfb._initialized = true;
			window.macfb.processElements(window.macfb._elements);

			FB.Event.subscribe('edge.create', function(response) {
			    window.macfb._onLiked(response);
			});
		};

		var fbRoot = document.createElement('div');
		fbRoot.id = 'fb-root';
		body.appendChild(fbRoot);

		var script = document.createElement('script');
		script.src = this._fbApiSrc;
		script.async = true;
		body.appendChild(script);

		return this;
	}

	this.isInitialized = function() {
	    return this._initialized;
	}

	this._onLiked = function(response) {
	    console.log('like: ', response);
	}

	this.processElements = function(elements) {
		if (this._initialized == false) {
			return;
		}
		if (elements == undefined || elements == null) {
			return;
		}

		for (var i = 0; i < elements.length; i++) {
			var element = elements[i];
			if (element.type == 'comment') {
				this.addCommentBox(element);
			} else if (element.type == 'like') {
				this.addLikeBox(element);
			} else if (element.type == 'publish') {
				this.setupPublish(element);
			} else if (element.type == 'commentPublish') {
				this.setupPublishComment(element);
			}
		}
	}

	this._formatLike = function(div) {
	}

	this._formatComments = function(div) {
	}

	this.getIEVersion = function() {
		var rv = -1;
		if (navigator.appName == 'Microsoft Internet Explorer') {
			var ua = navigator.userAgent;
			var re = new RegExp('MSIE ([0-9]{1,}[\.0-9]{0,})');
			if (re.exec(ua) != null) {
				rv = parseFloat(RegExp.$1);
			}
		}
		return rv;
	}

	this.setupPublishComment = function(params) {
		var div = document.getElementById(params.id);
		if (this._initialized == false) {
			return;
		}
		if (div == null) {
			return;
		}

		var width = (params.width == undefined ? 460 : params.width);

		var commentBox = document.createElement('div');
		commentBox.style.width = width + 'px';
		commentBox.style.backgroundColor = 'white';
		commentBox.style.padding = '10px';
		commentBox.style.fontFamily = '\'lucida grande\', tahoma, verdana, arial, sans-serif';
		commentBox.style.color = '#333333';
		commentBox.style.fontSize = '11px';

		var faceImg = document.createElement('img');
		faceImg.setAttribute('src', this._baseImgUrl + 'fb_thumb.gif');
		faceImg.style.styleFloat = 'left';
		faceImg.style.cssFloat = 'left';
		commentBox.appendChild(faceImg);

		var formBox = document.createElement('div');
		formBox.style.marginLeft = '55px';
		formBox.style.marginRight = '15px';
		formBox.style.backgroundColor = '#f3f3f3';
		formBox.style.border = '1px solid #d4d4d4';
		formBox.style.padding = '15px';

		var formTextArea = document.createElement('textarea');
		var formTextAreaId = params.id + '_text';
		formTextArea.setAttribute('id', formTextAreaId);
		formTextArea.style.border = '1px solid #bdc7d8';
		formTextArea.style.padding = '0px';
		formTextArea.style.height = '50px';
		formTextArea.style.width = (this.getIEVersion() == 6 ? (width - 97) + 'px' : '100%');
		formTextArea.style.fontFamily = '\'lucida grande\', tahoma, verdana, arial, sans-serif';
		formTextArea.style.fontSize = '11px';
		formTextArea.style.resize = 'vertical';
		if (params.message != undefined) {
			formTextArea.value = params.message;
		}
		formBox.appendChild(formTextArea);

		var postDiv = document.createElement('div');
		postDiv.style.textAlign = 'right';
		postDiv.style.paddingTop = '5px';

		var postImg = document.createElement('img');
		var postImgId = params.id + '_post';
		postImg.setAttribute('id', postImgId);
		postImg.setAttribute('src', this._baseImgUrl + 'fb_post.png');
		postImg.style.cursor = 'pointer';
		postImg.setAttribute('alt', 'Post');
		postImg.setAttribute('style', 'padding-top:5px;');
		postDiv.appendChild(postImg);
		formBox.appendChild(postDiv);
		commentBox.appendChild(formBox);

		var fbDiv = document.createElement('div');
		fbDiv.style.marginTop = '10px';
		fbDiv.style.fontSize = '9px';

		var fbLink = document.createElement('a');
		fbLink.setAttribute('href', 'http://developers.facebook.com/plugins?footer=1');
		fbLink.setAttribute('target', '_blank');
		fbLink.style.color = '#808080';
		fbLink.style.textDecoration = 'none';

		var fbImg = document.createElement('img');
		fbImg.style.border = 'none';
		fbImg.style.cssFloat = 'left';
		fbImg.style.styleFloat = 'left';
		fbImg.style.top = '-2px';
		fbImg.style.position = 'relative';
		fbImg.setAttribute('src', this._baseImgUrl + 'fb_icon.gif');
		fbLink.appendChild(fbImg);

		var fbText = document.createElement('div');
		fbText.style.marginLeft = '20px';
		fbText.appendChild(document.createTextNode('Facebook social plugin'));
		fbLink.appendChild(fbText);

		fbDiv.appendChild(fbLink);
		commentBox.appendChild(fbDiv);

		div.appendChild(commentBox);

		var publishObj = {
			'method': 'stream.publish',
			'attachment': {
				'name': params.name,
				'description': params.description
			}
		};

		if (params.prompt != undefined) {
			publishObj['user_message_prompt'] = params.prompt;
		}
		if (params.caption != undefined) {
			publishObj['attachment']['caption'] = params.caption;
		}
		if (params.link != undefined) {
			publishObj['attachment']['href'] = params.link;
			if (params.linkTitle != undefined) {
				publishObj['attachment']['properties'] = new Object();
				publishObj['attachment']['properties'][params.linkTitle] = {
					'text': params.link,
					'href': params.link
				};
			}
		}

		if (params.image != undefined && params.link != undefined) {
			publishObj['attachment']['media'] = [
				{
					'type': 'image',
					'src': params.image,
					'href': params.link
				}
			];
		}

		MACFB_bind(postImg, 'click', function() {
			var textArea = document.getElementById(formTextAreaId);
			if (textArea != null) {
				publishObj['message'] = textArea.value;
			}
			FB.ui(publishObj);
		});

	}

	this.setupPublish = function(params) {
		var div = document.getElementById(params.id);
		if (this._initialized == false) {
			return;
		}
		if (div == null) {
			return;
		}

		var publishObj = {
			'method': 'stream.publish',
			'message': params.message,
			'attachment': {
				'name': params.name,
				'description': params.description
			}
		};

		if (params.prompt != undefined) {
			publishObj['user_message_prompt'] = params.prompt;
		}
		if (params.caption != undefined) {
			publishObj['attachment']['caption'] = params.caption;
		}
		if (params.link != undefined) {
			publishObj['attachment']['href'] = params.link;
			if (params.linkTitle != undefined) {
				publishObj['attachment']['properties'] = new Object();
				publishObj['attachment']['properties'][params.linkTitle] = {
					'text': params.link,
					'href': params.link
				};
			}
		}

		if (params.image != undefined && params.link != undefined) {
			publishObj['attachment']['media'] = [
				{
					'type': 'image',
					'src': params.image,
					'href': params.link
				}
			];
		}

		MACFB_bind(div, 'click', function() {
			FB.ui(publishObj);
		});
	}

	this.addLikeBox = function(params) {
		var div = document.getElementById(params.id);
		if (this._initialized == false) {
			return;
		}
		if (div == null) {
			return;
		}

		var xfbml = document.createElement('fb:like');
                xfbml.setAttribute('style', 'padding-top:7px;padding-botton:0px;');
		if (params.dark != undefined && params.dark == true) {
			xfbml.setAttribute('colorscheme', 'dark');
		}
		if (params.href != undefined) {
			xfbml.setAttribute('href', params.href);
		}
		if (params.compact != undefined && params.compact == true) {
			xfbml.setAttribute('layout', 'button_count');
		}
		xfbml.setAttribute('show_faces', 'false');
		div.appendChild(xfbml);
		FB.XFBML.parse(div, function() {
			window.macfb._formatLike(div);
		});
	}

	this.addCommentBox = function(params) {
		var div = document.getElementById(params.id);
		if (this._initialized == false) {
			return;
		}
		if (div == null) {
			return;
		}

		var xfbml = document.createElement('fb:comments');
		if (params.xid != undefined) {
			xfbml.setAttribute('xid', params.xid);
		}
		if (params.num != undefined) {
			xfbml.setAttribute('numposts', params.num);
		}
		div.appendChild(xfbml);
		if (params.dark != undefined && params.dark == true) {
		    div.style.backgroundColor = 'white';
		    div.style.padding = '5px';
		}
		FB.XFBML.parse(div, function() {
			window.macfb._formatComments(div);
		});
	}

	this._getDivsByClass = function(root, className) {
		var elements = root.getElementsByTagName('div');
		var length = elements.length;
		var matches = new Array();
		for (var i = 0; i < length; i++) {
			if (elements[i].className = className) {
				matches.push(elements[i]);
			}
		}
		return elements;
	}

	this.init();
	return this;
}

function MACFB_bind(obj, e, func) {
	if (obj.addEventListener) {
		obj.addEventListener(e, func, false);
	} else if (obj.attachEvent) {
		obj.attachEvent('on' + e, func);
	}
}

function MACFB_init(params) {
	MACFB_bind(window, 'load', function() {
		window.macfb = MAC_Facebook(params);
	});
}

