var Mcontest = { 
	widget:{},
	log: function(msg){
		if (typeof console != 'undefined' && typeof console.log != 'undefined') {
			console.log(msg);
		}
	},
	ajax: function(method, url, async){
		var _req;
		try { _req = new XMLHttpRequest();
		} catch (e) {
			try { _req = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try { _req = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {
					Mcontest.log('This browser does not support AJAX!');
					return false;
				}
			}
		}
		_req.onreadystatechange = function(){
			if (_req.readyState == 4) {
				if (typeof arguments[3] === 'function') {
					var _fn = arguments[3];
					_fn(_req.responseText);
				}
			}
		};
		_req.open(method, url, async);
		_req.send(null);
		return _req.responseText;	
	},
	require: function(js){
		var _fn = typeof arguments[1] != 'undefined' ? arguments[1] : function(){};
		var _script = document.createElement('script');
		_script.setAttribute('type', 'text/javascript');
		_script.setAttribute('src', js);
		if (_script.addEventListener) {
			_script.addEventListener('load', _fn, false);
		} else {
			_script.onreadystatechange = function(){
				if (/^(loaded|complete)$/.test(this.readyState))
					_fn();
			};
		}
		document.getElementsByTagName('head')[0].appendChild(_script);	
	}
};
Mcontest.config = function(){
	var _config = {};
	return {
		set: function(widget, options){
			if (typeof _config[widget] == 'undefined') _config[widget] = {};
			if (arguments.length == 2) for (var _p in options) _config[widget][_p] = options[_p];
			else if (arguments.length == 3) _config[widget][options] = arguments[2];
		},
		get: function(w) {
			if (typeof _config[w] == 'undefined') return;
			var _c = _config[w];
			if (arguments.length == 1) return _c;
			if (arguments.length == 2) {
				var _option = arguments[1];
				if (typeof _c[_option] != 'undefined') return _c[_option];
			}
		}
	}
}();
Mcontest.widget.Tabs = function(){
	var _tabs = [], _panes = [];
	return {
		registerControls: function(id, index){
			var _control = document.getElementById(id);
			if (!_control) return;
			_control.onclick = function(){
				Mcontest.widget.Tabs.show(index);
			};
		},
		show: function(index){
			_tabs[index].className = 'current';
			_panes[index].style.display = 'block';
			for (var i=0; i<_panes.length; i++) {
				if (i == index) continue;
				_tabs[i].className = '';
				_panes[i].style.display = 'none';
			}
		},
		init: function(){
			var _tabContainer = document.getElementById('contest-tabs');
			var _paneContainer = document.getElementById('contest-content');
			if (!_tabContainer || !_paneContainer) return;
			_tabs = _tabContainer.getElementsByTagName('li');
			for (var i=0;i<_tabs.length;i++) {
				_tabs[i]._mgcTabIndex = i;
				_tabs[i].onclick = function(){
					Mcontest.widget.Tabs.show(this._mgcTabIndex); 
				};
			}
			var _divs = _paneContainer.getElementsByTagName('div');
			for (var i=0;i<_divs.length;i++) {
				if (_divs[i].className == 'content') {
					_panes.push(_divs[i]);
				}
			}
			Mcontest.widget.Tabs.show(Mcontest.config.get('Tabs', 'initialIndex'));
		}
	}
}();

Mcontest.widget.Captcha = function(){
	var _ready = false;
	return {
		isReady: function(){
			return _ready;
		},
		create: function(){
			var _containerId = Mcontest.config.get('Captcha', 'containerId');
			var _key = (function(){
				var _location = window.location.href;
				if (_location.search(/momslikeme.com/) != -1) {
					return '6LfC4QUAAAAAABjAKVKqvs4Wmuru-ULHtqNlvyTe';	
				} else if (_location.search(/gannettonline.com/) != -1) {
					return '6LeqbwgAAAAAAJGW5zvpSWnHArdeECkQQS6c4ESp';
				} else if (_location.search(/gmti.com/) != -1) {
					return '6LeVgwgAAAAAAM9jiKNBbTT7eYZmh0UYzFtQlhh8';
				}
			})();
			if (!_key) return;
			if (typeof document.getElementById(_containerId) == 'undefined') return false;
			Recaptcha.create(_key, _containerId, {
				theme: 'red', callback: function(){ _ready = true; }
			});
		},
		refresh: function(){
			Recaptcha.reload();
		},
		validate: function(obj){
			var _url = (function(){
					var _url = '/apps/pbcs.dll/section?category=mcontest&template=verify&nocache=1&loc=';
					_url += window.location.hostname;
					return _url;
			})();		
			var _requestUrl = _url
				+ '&challenge=' + Mcontest.widget.Form.getField('recaptcha_challenge_field')
				+ '&response=' + Mcontest.widget.Form.getField('recaptcha_response_field');
			var _result = Mcontest.ajax('GET', _requestUrl, false);
			return _result;
		},
		notify: function(result){
			var _msgContainerId = Mcontest.config.get('Captcha', 'msgContainerId');
			var _msgContainer = document.getElementById(_msgContainerId);
			if (result) {
				if (_msgContainer.firstChild) {
					_msgContainer.removeChild(_msgContainer.firstChild);
				}
			} else {
				if (_msgContainer.firstChild) _msgContainer.removeChild(_msgContainer.firstChild);
				_msgContainer.appendChild(document.createTextNode('Incorrect entry. Please try again!'));
			}
		},		
		init: function(){
			Mcontest.require('http://api.recaptcha.net/js/recaptcha_ajax.js', Mcontest.widget.Captcha.create);
		}
	};
}();

Mcontest.widget.Form = function(){
	return {
		getField: function(field) {
			var _form = document.forms[0];
			if (typeof _form.elements[field] != 'undefined') {
				return _form.elements[field].value;
			}
		},
		validate: function(rules){ 
			var _numErrors = 0;
			var _form = document.forms[0];
			if (Mcontest.widget.Captcha.isReady()) {
				var _captchaResult = Mcontest.widget.Captcha.validate();
				if (_captchaResult.search("true") == -1) {
					Mcontest.widget.Captcha.notify(false);
					_numErrors++;
				} else {
					Mcontest.widget.Captcha.notify(true);
				}
			}
			var _result = Mcontest.widget.Form.Validator.init(_form, rules);
			if (!_result || _numErrors) {
				if (Mcontest.widget.Captcha.isReady()) Mcontest.widget.Captcha.refresh();
				return false;
			} else {
				_form.elements['Name'].value = _form.elements['FirstName'].value + ' ' + _form.elements['LastName'].value;
				return true;
			}		
		},
		init: function(hasQuestion){
			var _requiredFields = [], _r = Mcontest.config.get('Form', 'validationRules').split(';');
			if (typeof document.forms[0] == 'undefined') return;
			if (typeof document.forms[0].elements['requiredFields'] == 'undefined') return;
			if (window.location.href.search('quest') != -1) {
				Mcontest.widget.Captcha.init();
			}
			if (!hasQuestion) {
				var _q = document.createElement('input');
				_q.setAttribute('type', 'hidden');
				_q.setAttribute('value', 1);
				document.forms[0].elements['q1'] = _q;
			}
			if (hasQuestion) _r.push('q1:required');
			_r.push('Agreement:required');
			var _form = document.forms[0];			
			var _rules = {};
			for (var i=0;i<_r.length;i++) {
				var _f = _r[i].split(':');
				_rules[_f[0]] = _f[1];
			}
			for (var _field in _rules) {
				if (_rules[_field].search('required') != -1) {
					if (typeof(_form.elements[_field]) == 'undefined') continue;
					_requiredFields.push(_field);
					var _fieldLabel = _form.elements[_field].previousSibling;
					if (typeof(_fieldLabel) != 'undefined') {			
						var _flag = document.createElement('span');
						_flag.appendChild(document.createTextNode('* '));
						try {
							_fieldLabel.insertBefore(_flag, _fieldLabel.childNodes[0]);
						} catch(e) {}
					}
				}
			}
			_form.requiredFields.value = _requiredFields.join(',');
			_form.onsubmit = function(){
				return Mcontest.widget.Form.validate(_rules);
			};
		}
	};
}();

Mcontest.widget.Form.Validator = {
	isRequired: function(field){
		if (field.type == "checkbox") {
			if (!field.checked) {
				return "You must check this box in order to continue!";
			}
		} else if (typeof field.value == 'undefined') {
			var _value = '';
			for (var i=0; i<field.length; i++) {
				if (field[i].checked) {
					_value = field[i].value;
			   }
			}
			if (_value == '') {
				return 'Please answer this question!';
			}
		} else {
			if (field.value == "") {
				return "Please enter a valid value!";
			}
		}
		return true;
	},
	isExactLength: function(field, len){
		if (field.value.length != len) return "Please enter a " + len + " character value!";
		return true;
	},
	isMaxLength: function(field, limit){
		if (field.value.length > limit) return "Please enter no more than " + limit + " characters.";
		return true;
	},
	isMinLength: function(field, limit){
		if (field.value.length < limit) return "Please enter no fewer than " + limit + " characters.";
		return true;
	},
	isNumeric: function(field){
		var _result = field.value.replace(/[0-9]*/g, "");
		if (_result != "") return "Please enter only numeric characters!";
		return true;
	},
	isValue: function(field, val){
		if (field != val) return "Please provide the correct value!";
		return true;
	},
	isEmail: function(field){
		var _re = /(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(2([0-4]\d|5[0-5])|1?\d{1,2})(\.(2([0-4]\d|5[0-5])|1?\d{1,2})){3} \])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/;
		var _result = field.value.match(_re);
		if (!_result) return "Please enter a valid email address!";
		return true;
	},

	init: function(obj, rules){
		var _numErrors = 0;
		var _errorClassName = 'validation-error';
		var _errorDivs = document.getElementsByTagName("div");
		for (var i=0; i<_errorDivs.length; i++) {
			if (_errorDivs[i].className == _errorClassName) {
				_errorDivs[i].parentNode.removeChild(_errorDivs[i]);
			}
		}	
		for (var _field in rules) {
			var _checks = rules[_field].split(",");
			for (var i=0; i< _checks.length; i++) {
				var _checksArray = _checks[i].split("[");
				var _func = "is" + _checksArray[0].charAt(0).toUpperCase() + _checksArray[0].substring(1);
				var _params = (_checksArray.length > 1) ? _checksArray[1].split("]")[0] : "";
				var _valFunc = Mcontest.widget.Form.Validator[_func];
				var _result = _valFunc(obj.elements[_field], _params);
				if (_result != true) {
					_numErrors++;					
					var _errorTxt = document.createTextNode(_result);
					var _errorDiv = document.createElement("div");
					_errorDiv.className = _errorClassName;
					_errorDiv.appendChild(_errorTxt);
					var _containerNode = obj.elements[_field].parentNode;
					if (typeof _containerNode == 'undefined') {
						var _c = document.getElementById('question-container');
						var _cq = document.getElementById('cq');
						_c.insertBefore(_errorDiv, _cq);
					} else {
						obj.elements[_field].parentNode.appendChild(_errorDiv);
					}
					break; // only one error per field at a time
				}
			}
		}
		return _numErrors == 0;
	}	
};