var IMFISHY = function(){
	var _d = YAHOO.util.Dom,
		_e = YAHOO.util.Event;

	var CONST_CN = 'message';
	var CONST_CHAR_MAX = 500;

	var elChars,
		elDonateContainer,
		elEmail,
		elFormContainer,
		elFormDesc,
		elFormDescDone,
		elFullName,	
		elMessage,
		elMessages,
		elSubmit,
		elTarget,
		oForm,
		sEmailInitMsg;

	/** 
	* @description Initialize vars
	* @method initialize
	* @ptivate
	*/
	var initialize = function(){
		// get element refs
		elChars = _d.get('chars');
		elDonateContainer = _d.get('donate_container');
		elEmail = _d.get('email');
		elFormContainer = _d.get('form_container');
		elFormDesc = _d.get('form_desc');
		elFormDescDone = _d.get('form_desc_done_container');
		elFullName = _d.get('fullname');
		elMessage = _d.get('message');
		elMessages = _d.get('messages');
		elSubmit = _d.get('submit');
		oForm = _d.get('form_container');
		sEmailInitMsg = elEmail.value;

		if (YAHOO.util.Cookie.get(CONST_CN)){
			_d.setStyle(elFormContainer, 'display', 'none');
			insertDone();
		}
		else{
			_d.setStyle(elFormContainer, 'visibility', 'visible');
			_d.setStyle(elFormDesc, 'visibility', 'visible');
			_e.on(elSubmit, 'click', doSubmit.add);
			_e.on(elMessage, 'keypress', doCharCount);
			_e.on(elEmail, 'focus', doEmailClick);
			_e.on(elDonateContainer, 'click', doDonateClick);
		}
	}

	/** 
	* @description Handles clicks on donate links
	* @method doDonateClick
	* @ptivate
	*/
	var doDonateClick = function(e){
		// stop the event
		_e.stopEvent(e);
		
		// get ref to target
		elTarget = _e.getTarget(e)

		// check the radio button
		try{
			if (elTarget.nodeName.toLowerCase() == 'input'){
				elTarget.checked = true;
			}
			else if(elTarget.nodeName.toLowerCase() == 'a'){
				elTarget.firstChild.checked = true;
			}
		}
		catch(e){
			// do nothing
		}
				
		// open donate window
		window.open(elTarget.href);
	}

	/** 
	* @description Remove the init msg in the email input 
	* @method doEmailClick
	* @ptivate
	*/
	var doEmailClick = function(){
		if (elEmail.value == sEmailInitMsg){
			_d.setStyle(elEmail, 'color', '#000');
			elEmail.value = '';
		}
	}

	/** 
	* @description Displays and styles the current count
	* @method doCharCount
	* @ptivate
	*/
	var doCharCount = function(){
		elChars.innerHTML = CONST_CHAR_MAX - elMessage.value.length;
		if (elChars.innerHTML < 0){
			_d.setStyle( elChars, 'color', '#f00' );
		}
		else{
			_d.setStyle( elChars, 'color', '#ccc' );
		}
	}

	/** 
	* @description format form area
	* @method insertDone
	* @ptivate
	*/
	var insertDone = function(){
		_d.setStyle(elFormDesc, 'display', 'none');
		_d.setStyle(elFormDescDone, 'display', 'block');
	}

	/** 
	* @description replaces carriage returns
	* @method formatMsg
	* @ptivate
	*/
	var formatMsg = function(s, sReplace){
		s = s.replace('\n', sReplace, 'g');
		s =	s.replace('\r', sReplace, 'g');
		return s;
	}

	/** 
	* @description Insert new messages into body
	* @method insertMsg
	* @ptivate
	*/
	var insertMsg = function(){
		var sMsg = formatMsg(elMessage.value, '<br>&nbsp;');
		var sNewMsg = '<div class="message"><div class="message_name">' + elFullName.value + '</div><div class="message_date">just now</div><div class="message_content">' + sMsg + '</div></div>'
		elMessages.innerHTML = sNewMsg + elMessages.innerHTML;
	}

	/** 
	* @description Submit the new message to web svc
	* @method doSubmit
	* @ptivate
	*/
	var doSubmit = function(e){
		// will represent async call for verification email
		var oSubmit,
			oAnim,
			sMsg,
			sParams = '';

		// undim the form
		var undim = function(){
			_d.setStyle(elFullName, 'opacity', '1');
			_d.setStyle(elEmail, 'opacity', '1');
			_d.setStyle(elMessage, 'opacity', '1');
		}

		// success handler
		var handleSuccess = function(o){
			YAHOO.util.Cookie.set(CONST_CN, true, { 
				expires: new Date('January 12, 2025') 
			});

			oAnim = new YAHOO.util.Anim(elFormContainer, { height: { to: 0 } }, 0.5, YAHOO.util.Easing.backIn);
			oAnim.onComplete.subscribe(function(){
				_d.setStyle(elFormContainer, 'display', 'none');
				insertDone();
				insertMsg();
			});
			oAnim.animate();
		}

		// failure handler
		var handleFailure = function(o){
			undim();
			elSubmit.disabled = false;
			alert('Oops. A error occurred. Try refreshing the page and submitting your request again.')
		}

		return {
		
			add: function(){
				// check for call in progress
				if (YAHOO.util.Connect.isCallInProgress(oSubmit)){
					return;
				}

				if (!elFullName.value){
					return alert('Oops. You\'ll need to fill in at least the "name" field.')
				}

				if (elFullName.value.length > 100){
					return alert('Oops. Your name is a bit too long - maximum is 100 characters.')
				}

				if (elMessage.value.length > 500){
					return alert('Oops. Your message is a bit too long - maximum is 500 characters.')
				}

				// dump the email input value if same as init msg
				if (elEmail.value == sEmailInitMsg){
					elEmail.value = '';
				}

				// test email input val
				if (!/^$|^[\w-\.]{1,}\@([\da-zA-Z-]{1,}\.){1,}[\da-zA-Z-]{2,4}$/.test(elEmail.value)){
					return alert('Oops. Your email address is not properly formatted')
				}
				
				// iterate through form elements and build parm string
				var aFormElements = oForm.getElementsByTagName('input');
				var sName, sValue;
				for (var i = 0; i < aFormElements.length; i++){
					sValue = aFormElements[i].value;

					if (sValue != '' && sValue != null){
						sName = aFormElements[i].id;
						sParams = sParams + sName + '=' + encodeURIComponent(sValue) + '&';
					}
				}

				// format msg and append to params
				sMsg = formatMsg(elMessage.value, '[@BR]');
				sMsg = encodeURIComponent(sMsg);
				sParams = sParams + 'message=' + sMsg;
				
				// dim the form
				_d.setStyle(elFullName, 'opacity', '.2');
				_d.setStyle(elMessage, 'opacity', '.2');
				_d.setStyle(elEmail, 'opacity', '.2');
				elSubmit.disabled = true;

				// make the call
				oSubmit = YAHOO.util.Connect.asyncRequest(
					'POST', 
					'add',
					{ success: handleSuccess, failure: handleFailure },
					sParams
				);
			}
		
		}
		
	}();

	initialize();
}();