//alert('js included');

function SubmitForm(objForm, polite) {

	/**
	var insert_rels = document.getElementById('insert_relations'); 
	if (insert_rels) { 
		var relation_content = insert_rels.innerHTML;
		var ff = document.createElement("input");
   		ff.type = "hidden";
   		ff.name = "append_relations";
   		ff.value = relation_content;
   		objForm.appendChild(ff);
	}
	*/
	
	trace('submitForm::' . objForm + '::' + polite);


	if(rpicks != 'undefined') {
		if(rpicks.length > 0 && objForm.guid.value == '') {
			
			for(i=0;i < rpicks.length; i++) {
				frm = rpicks[i].formname;
				prp = rpicks[i].property;
				
				rels = {};
				p = [];
								
				trace('rpick::' + frm + '::' + prp);
				
				pp = '';
				$('#' + frm + '_' + prp + '_sorts tr').each(function () {
					trace($(this).attr('id'));
					iid = $(this).attr('id');
					ex = iid.split('_');
					gg = ex[ex.length - 1];
					gt = ex[ex.length - 2];
					trace('REL::' + gg + '::' + gt);
					if(gg.length > 0) {
						p['rels[' + i + ']'] = gg;
						pp += pp.length > 0 ? "," : "";
						pp += "{ \"guid\" : \"" + gg  + "\",  \"type\" : \"" + gt  + "\"}"
						i++;
					}
				});
				
				if(pp.length > 0) {
					pp = '[' + pp + ']';
					
					inpnme = "rels[" + prp + "]";

					trace('rels::' + pp);

					inp = $('<input type="hidden"></input>').attr({
						'name' : inpnme
						, 'value' : pp
					});

					$('#' + objForm.id).append(inp);

				}

			}
		}
	}

	//return false;

	if(relpickers) {
	if(relpickers.length > 0 && objForm.guid.value == '') {
		
		var relation_content = [];
		
		for(i=0; i < relpickers.length; i++) {
			
			for(type in relpickers[i].related) {
				for(rel in relpickers[i].related[type]) {
					item = relpickers[i].related[type][rel];
					
					pars = {
						relation : relpickers[i].config.node.relation
						, generation : relpickers[i].config.node.generation
					};
					
					switch(relpickers[i].config.node.generation) {

						case 'children':

							pars.childtype = relpickers[i].inventory[type][rel].type;
							pars.child = relpickers[i].inventory[type][rel].guid;
							pars.parenttype = relpickers[i].config.type;
							pars.parent = relpickers[i].config.guid;

							break;

						case 'parents':

							pars.childtype = relpickers[i].config.type
							pars.child = relpickers[i].config.guid;
							pars.parenttype = relpickers[i].inventory[type][rel].type;
							pars.parent = relpickers[i].inventory[type][rel].guid;

							break;

					}
					
					relation_content.push(pars);
					
				}
			}
						
		}
		
		//relation_content = "{" + relation_content + "}";
		var inp = $('<input type="hidden"></input>').attr({
			'name' : 'append_relations'
			, 'value' : JSON.stringify(relation_content)
		});
		
		$('#' + objForm.id).append(inp);
		
		trace("append_relations::" + objForm.append_relations.value);
		
		//return false;
		
		//objForm.mode.value="async";
	}	
	}
	
	// now we have the data there

	if(!polite){
		if(Validate(objForm)) {
			if(objForm.mode.value == 'async') {
				formdata = $('#' + objForm.id).serializeArray();
				fd = formdata;
				
				/**
				for(i=0;i < formdata.length;i++) {
					if(formdata[i].name == 'callback') {
						formdata[i].value = escape(formdata[i].value);
					}
				}
				*/
				
				formdata.push({"name":"output_format", "value" : "json"});
				trace(baseurl + '::AJAX POST::' + JSON.stringify(formdata));
				
				$.post(baseurl, formdata, function(data) {
					trace(baseurl + '::FORMDATA::' + JSON.stringify(formdata));
					trace(baseurl + '::SERVICE::' + JSON.stringify(data));
					
					var service = '';
					var action = '';
					var callback = '';
					var url = '';
					
					for(i=0;i < formdata.length;i++) {
						switch(formdata[i].name) {
							
							case 'service':
							service = formdata[i].value;
							break;
							
							case 'action':
							action = formdata[i].value;
							break;
							
							case 'cb_onsuccess':
							callback = formdata[i].value;
							break;
							
						}
					}
					
					trace('AJAX POST::callback::' + callback);
					
					//return;
					
					if(!data) {
						strerror = '<p>We\'re sorry. We couldn\'t process your form.  Please try again';


						if (document.getElementById("lbError")) { 	
						document.getElementById('lbError').className = 'errordiv';
						document.getElementById('lbError').innerHTML = strerror;
						} else { 
						document.getElementById('errorDiv').className = 'errordiv';
						document.getElementById('errorDiv').innerHTML = strerror;
						}
						return false;
					
					} else if(data[service] == 1) {
						
						
						if(!callback.length > 0) {
							if(action.length > 0) {
								url = action;
							} else {
								url = window.document.location.toString();
							}
							
							trace(action + '::' + url);
							
							var qs = url.indexOf('?') > 0 ? '&' : '?';
							
							//window.document.location = url + qs + 'nocache=1'
						} else {
							trace('callback::' + JSON.stringify(data));
							eval(callback);
						}
						
					} else {
						
						strerror = '<p>We\'re sorry. We couldn\'t process your form for the following reasons:</p><ul>' + unescape(data.err) + '</ul>';
						trace(strerror);
						if (document.getElementById("lbError")) { 	
						document.getElementById('lbError').className = 'errordiv';
						document.getElementById('lbError').innerHTML = strerror;
						} else { 
						document.getElementById('errorDiv').className = 'errordiv';
						document.getElementById('errorDiv').innerHTML = strerror;
						}
						return false;
						
					}
					
				}, 'json');
				
				return false;
			} else {
				objForm.submit();
			}
		} else {
			return false;
		}
	} else {
		return Validate( objForm, true );
	}
	
};

var XMLHttpFactories = [
	function(){ return new XMLHttpRequest() },
	function(){ return new ActiveXObject( "Msxml2.XMLHTTP")},
	function(){ return new ActiveXObject( "Msxml3.XMLHTTP")},
	function(){ return new ActiveXObject( "Microsoft.XMLHTTP")},
];
var createXMLHttpRequest = function(){
	var xmlhttp = false;
	for( var i = 0; i < XMLHttpFactories.length; i++ ){
		try {
			xmlhttp = XMLHttpFactories[i]();
		} catch( e ){
			continue;
		}
		break;
	}
	return xmlhttp;
};

function checkAge(objForm) {

	guid = objForm.elements['guid'].value;
	elem = objForm.elements['birthday'];
	if(guid != '' && !elem) {
		trace("handling account, but not new");
		return true;
	}
	
	var y = objForm.elements['birthday_year'].value;
	var m = objForm.elements['birthday_month'].value;
	var d = objForm.elements['birthday_day'].value;
	
	var mindt = new Date();
	n = mindt.getTime();
	
	var fourteen = 86400000*365*14; //fourteen
	
	mindt.setTime(n-fourteen);
	var nowdt = new Date(y, m, d);
	trace('mindt::' + mindt.getTime() + '::' + nowdt.getTime());
	if(mindt > nowdt) {
		trace('OLD ENOUGH ' + (mindt.getTime() / 86400000  / 365) );
		return true;
	} else {
		trace('TOO YOUNG' + (mindt.getTime() / 86400000 / 365) );
		$('#errorDiv').html('<ul><li>YOU MUST BE 18 YEARS OLD TO ENTER THIS CONTEST.</li></ul>');
		handleError("I'm sorry, you're too young to register on FocusFeatures.com", 1);
		return false;
	}
	
	return true;
	
	// var year_field = document.getElementById('birthday_year');
	var year_field = objForm.elements['birthday_year'];
	if (!year_field) {
		trace("handling account, but not year field called birthday_year!");
		return false;
	}
    var year = objForm.elements['birthday_year'].value;   
    var month = objForm.elements['birthday_month'].value; 
    var day = objForm.elements['birthday_day'].value; 
    if (year == undefined || year < 1900 || isNaN(year) ) {
        // handleError("Year is required but empty");
	debug("Year is required but empty, let Validate handle it");
        return true;
    }
	var today = new Date();
    var curyear = today.getFullYear();
    var diff = curyear - year;
    debug("user is: " + diff + " years old");
    if (diff < 14) {
        trace("user is too young");
        handleError("I'm sorry, you're too young to register on FocusFeatures.com", 1);
        return false;
    } else if (diff == 14) { 

        
        var curmonth = today.getMonth();
        var mdif = month - curmonth;
        trace("user is " + mdif + " months into their " + diff + "th year");
        if (mdif > 0 || isNaN(month) ) { 
                handleError("I'm sorry, you're too young to register on FocusFeatures.com.", 1);
                return false;
        } else if (mdif == 0) { 
            var curday = today.getDate();
            var ddif = curday - day;
            if (ddif < 1 || isNaN(day) ) { 
                trace("user is " + ddif + " days into their " + mdif + "th month");
                handleError("I'm sorry, you're too young to register on FocusFeatures.com." , 1);
                return false;
            } 
        }
    }

	return true;
} //end function 

function handleError(arg) {
	debug("handling error: " + arg);
	document.location.href="/common/failed.php?errstr=" + arg;
}

function Validate(objForm, polite) {
	
	debug('Validate::' + objForm);

	if(objForm.elements['type']) {
		var type = objForm.elements['type'].value;
		if (type == 'account') {
			trace("checkAge::validating account age");
			if (!checkAge(objForm)) {
				return false;
			}
		} else {
			trace("not an account::no age requirement");	
			//return true;
		}
	}
	
	if( polite ){
		var errObj = {};
	}


	
	var strerror = new String();
	var error = false;
	var thiserror = false;
		
		if(document.getElementById('wait')) {
                	//inhtml = "<img src='/images/wait.gif'>";
                	//document.getElementById('wait').innerHTML = inhtml;
			//document.getElementById('wait').style.visibility = "visible";
		}
	
	with(objForm) {
		
		for(i=0; i < elements.length; i++){
			debug(elements[i].name + '::CLASS::' + elements[i].className + '::VALUE::' + elements[i].value + '::ERROR::' + error);
			
			iid = elements[i].id;
			
			if(iid == '') {
				continue;
			}
			
			thiserror = false;
			
			debug(iid + '::' + elements[i].name + '::ERROR::' + error + '::' + elements[i].className);
			
			//CHECK FOR DATETIME
			if(thiserror == false) {
				if(elements[i].className.indexOf('datetime') != -1 && (document.getElementById(iid +'_year').value != '' && document.getElementById(iid +'_month').value != ''  && document.getElementById(iid +'_day').value != '' || document.getElementById(iid).value != '')) {
					debug('DATETIME::' + elements[i].name + '::' + elements[i].value);
					elements[i].value = document.getElementById(iid +'_year').value + '-' 
					+ document.getElementById(iid +'_month').value + '-' 
					+ document.getElementById(iid +'_day').value + ' ' 
					+ document.getElementById(iid +'_hour').value + ':' 
					+ document.getElementById(iid +'_minute').value + ' ' 
					+ document.getElementById(iid+'_meridian').value;
					debug(iid + '::' + elements[i].value);
					
					if(document.getElementById(iid +'_year').value == '' || document.getElementById(iid +'_month').value == ''  || document.getElementById(iid +'_day').value == '') {
						elements[i].value = '';
					}
				}
			}
			
			//CHECK FOR TIME
			if(thiserror == false) {
				if(elements[i].className.indexOf(' time') != -1 && (document.getElementById(iid +'_hour').value != '' && document.getElementById(iid +'_minute').value != ''  && document.getElementById(iid +'_meridian').value != '' || document.getElementById(iid).value != '')) {
					debug('DATETIME::' + elements[i].name + '::' + elements[i].value);
					elements[i].value = document.getElementById(iid +'_hour').value + ':' 
					+ document.getElementById(iid +'_minute').value + ' ' 
					+ document.getElementById(iid +'_meridian').value;
					debug(iid + '::' + elements[i].value);
					
					if(document.getElementById(iid +'_hour').value == '' || document.getElementById(iid +'_minute').value == ''  || document.getElementById(iid +'_meridian').value == '') {
						elements[i].value = '';
					}
				}
				
				if(elements[i].value == ': ') {
					elements[i].value = '';
				}
			}
			
			//CHECK FOR DATE
			if(thiserror == false) {
				if(elements[i].className.indexOf('date') != -1 && elements[i].className.indexOf('datetime') == -1) {
					debug('DATE::' + elements[i].name + '::' + elements[i].value);
					if((document.getElementById(iid +'_year').value != '' && document.getElementById(iid +'_month').value != ''  && document.getElementById(iid +'_day').value != '') || document.getElementById(iid).value != '') {
						elements[i].value = document.getElementById(iid +'_year').value + '-' 
						+ document.getElementById(iid +'_month').value + '-' 
						+ document.getElementById(iid +'_day').value;
						debug(elements[i].name + '::' + elements[i].value);
					}
					
					//debug('DATE::' + elements[i].name + '::' + elements[i].value);
					//return false;
					
					if(document.getElementById(iid +'_year').value == '' || document.getElementById(iid +'_month').value == '' || document.getElementById(iid +'_day').value == '') {
						debug('DATE::EMPTY ELEM::' + elements[i].name + '::' + elements[i].value);
						elements[i].value = '';
					}
					
					debug('DATE::' + elements[i].name + '::' + elements[i].value);
					
				}
			}
			
			//CHECK FOR PHONE
			if(thiserror == false) {
				
				if(elements[i].className.indexOf('phone') != -1 && (document.getElementById(iid +'_area').value != '' && document.getElementById(iid +'_prefix').value != ''  && document.getElementById(iid +'_suffix').value != '' || document.getElementById(iid).value != '')) {
					elements[i].value = document.getElementById(iid +'_area').value 
					+ document.getElementById(iid +'_prefix').value 
					+ document.getElementById(iid +'_suffix').value;
					debug(elements[i].name + '::' + elements[i].value);
				}
			}
			
			//CHECK FOR REQUIRED
			if(elements[i].className.indexOf('required') > -1) {
				debug('checking required::' + elements[i].name);
				
				if (elements[i].type == 'checkbox') {
					if (elements[i].checked) {
						debug("checked, ok");
					} else {
						if(!polite){
							if(elements[i].id == "terms"){
								strerror += '<li>You must accept our <strong>TERMS OF SERVICE</strong></li>';
							} else {
								strerror += '<li><strong>' + elements[i].name + '</strong> is required</li>';
							}
							
							thiserror = true;
							error = thiserror;
						} else {
							errObj[elements[i].id] = "required";
							error = true;
						}
					}
				} else {
					if(elements[i].value == '') {
						if(!polite){
							strerror += '<li><strong>' + elements[i].name + '</strong> is required</li>';
							thiserror = true;
							error = thiserror;
						} else {
							errObj[elements[i].id] = "required";
							error = true;
						}
					}
				}
			} else {
				if (elements[i].type == 'checkbox') {
					
					debug('checkbox not required: ' + elements[i].name);
				}
			}
			
			//CHECK FOR CONFIRM
			if(thiserror == false) {
				if(elements[i].className.indexOf('confirm') != -1) {
					debug('checking confirm::' + elements[i].name);
					if(elements[i].value != objForm.elements['confirm_' + elements[i].name].value) {
						if(!polite){
							strerror += '<li><strong>' + elements[i].name + 's</strong> do not match</li>';
							thiserror = true;
							error = thiserror;
							//continue;
						} else {
							errObj[elements[i].id] = "mismatch";
							error = true;
						}
					}
				}
			}
			
			//CHECK FOR FILETYPE
			if(thiserror == false) {
				if(elements[i].className.indexOf('file') != -1 && elements[i].value.length) {
					var types = elements[i].className.substring(elements[i].className.indexOf('types_')+6);
					types = types.split(' ');
					types = types[0];
					
					var ending =  elements[i].value.substring(elements[i].value.lastIndexOf('.')+1);
					ending = ending.toLowerCase();
					debug('checking file::' + types + '::' + ending);
					
					if(types.indexOf('||' + ending + '||') == -1) {
						dispTypes = types.split('||');
						dispTypes = dispTypes.join('<br/>');
						strerror += '<li><strong>' + elements[i].value.substr(elements[i].value.lastIndexOf('/')+1) 
						+ '</strong> is not a valid file type.  You can upload the following types of files:' + dispTypes + '</li>';
						//elements[i].value = '';
						thiserror = true;
						error = thiserror;
					}
				}
			}
			
			//CHECK FOR PATTERN
			if(thiserror == false) {
				if(elements[i].className.indexOf('regex_') != -1) {
					var pos = elements[i].className.indexOf('regex_');
					var regex = elements[i].className.substring(elements[i].className.indexOf('regex_'));
					//trace('checking pattern::' + elements[i].name + '::' + regex);
					pos = regex.indexOf(' ');
					if(pos > 0) {
						regex = regex.substring(0, pos);
					}
					regex = regex.substring(regex.indexOf('regex_')+6);
					
					
					trace('checking pattern::' + elements[i].name + '::' + regex);
					
					eval('regex = /' + regex + '/;');
				
					if(!regex.test(elements[i].value)) {
						if(!polite){
							if( elements[i].name == "password" ){
								strerror = '<li><strong>password</strong> must consist of digits and letters and be between 5 and 12 characters long.</li>';
							} else {
								strerror += '<li>' + elements[i].value + ' is not a valid <strong>' + elements[i].name + '</strong></li>';
							}
							
							thiserror = true;
							error = thiserror;
							//continue;
						} else {
							errObj[elements[i].id] = "regex";
							error = true;
						}
					}
				}
			}
			
			//CHECK FOR UNIQUENESS
			if(thiserror == false) {
				if(elements[i].className.indexOf('unique') != -1) {
					debug('checking uniqueness::' + elements[i].name);
			  		var xhReq = createXMLHttpRequest();
					// debug('type: ' . elements['type']); 	
					debug("here");
					debug(objForm.elements['type'].value); 
					var mtype = objForm.elements['type'].value; 
			  		var x = "/services/isunique/?publickey=" + objForm.elements['publickey'].value + "&output_format=json&type=" + mtype + "&field=" +elements[i].name + "&value=" + escape(elements[i].value) + "&guid=" + objForm.elements['guid'].value;
			  		
			  		trace('urlx::'+x);
			  		//return false;
			  		//window.open(x);
			  		debug(x);
			  		xhReq.open("GET",x, false);
			  		xhReq.send(null);
					debug(xhReq.responseText);
			  		eval('serverResponse = ' + xhReq.responseText);
			  		
			  		var returnVal = eval('serverResponse.' + elements[i].name);
			  		
			  		if(!returnVal) {
			  			strerror += '<li>That <strong>' + elements[i].name + '</strong> is already taken</li>';
			  			thiserror = true;
						error = thiserror;
						//continue;
 			  		}
 			  		
 			  		//strerror += '<li>That <strong>' + elements[i].name + '</strong> is already taken</li>';
			  		//thiserror = true;
					//error = thiserror;
 			 	}
			}
		}
		
	}
	

	if(error ) {

		if(!polite){
			strerror = '<p>We\'re sorry. We couldn\'t process your form for the following reasons:</p><ul>' + strerror + '</ul>';
			debug(strerror);
			if (document.getElementById("lbError")) { 	
			document.getElementById('lbError').className = 'errordiv';
			document.getElementById('lbError').innerHTML = strerror;
			} else { 
			document.getElementById('errorDiv').className = 'errordiv';
			document.getElementById('errorDiv').innerHTML = strerror;
			}
			return false;
		} else {
			return errObj;
		}
	} else {
		//objForm.submit();
		// inhtml = "<div style='position: absolute;  left: 200px; top: 200px;'><img src='/images/wait.gif'></div>";
		//inhtml = "<img src='/images/wait.gif'>";
		if(document.getElementById('wait')) {
		//document.getElementById('wait').innerHTML = inhtml;
		}
		// document.getElementById('wait').style.visibility = "visible";
		return true;
	}
	
};

