function addInputSubmitEvent(form, input) {
    input.onkeydown = function(e) {
        e = e || window.event;
        if (e.keyCode == 13) {
            if (!form.onsubmit || form.submit()  )
				form.submit();
            return false;
        }
    };
}

function decodeEmail(m){
    m = m.gsub('&', '@').gsub('#', '.');
    return m.link( "mailto:'" + m + "'");
}

// Moves focus to the 1st input field of the 1st form on the page (or to a given form)
function focusFirstFormOnPage(editor_name) {
    var editor = $(editor_name) || document;
    if (editor){
        var forms = editor.getElementsByTagName('form');
        if (forms && forms.length > 0)
			$(forms[0]).focusFirstElement();
    }
}

// Happens at the end of AJAX call when we need to update the fancy checkbox
function updateAjaxCheckbox(request, el){
	el.removeClassName('enabled');
	if (request.status == 200)
		el.addClassName(request.responseText);
	else
	{
		if (!request.responseText || request.responseText == "" || request.responseText[0] == '<')
			alert("An error has occured");
		else
			alert(request.responseText);
	}
	el.removeClassName('spinning');
}

function updateAccessImage(request, el){
    // cancel 'fading' effect on prev image:
    var queue = Effect.Queue;
    queue.each(function(e) {e.cancel() });

    // Success? Replace image with what we got from AJAX response:
    if (request.status == 200){
        el.src = "/images/" + request.responseText;
    }
    Element.setOpacity(el.id, 1);
}


// safely sets innerHTML property
function SetInnerHTML(el, _t){
	if (el){	
		el.innerHTML = _t;
		return true;
	}
	return false;
}


// returns "error summary" element for the form
function GetErrorSummaryFor(form){
	var els = form.getElementsByClassName('validationSummary');
	return els ? els[0] : null;
}

// shows/hides error summary element
function ShowErrorSummaryFor(form, text){
	var el = GetErrorSummaryFor(form);
	if (SetInnerHTML(el, text))
	{
       	el.show();
	}
}


// returns the next sibling of a given element as a field for validation errors
function ErrorElementFor(el){
	if (!el) return null;
	el = $(el);
	return el.next('span'); 
}


// returns an error message for field
function ErrorMessageFor(el){
	return GetValidationParam(el, "message");
}


// shows an error for given field
function ShowErrorFor(el, error_msg){
	// mark the field
	var error_el = ErrorElementFor(el);
	if (SetInnerHTML(error_el, "&laquo;")){
       	error_el.show();
		el.focus();
	}
	ShowErrorSummaryFor(el.form, ErrorMessageFor(el) || error_msg);
}


// clears field-specific error message
function ClearErrorFor(el){
	SetInnerHTML(ErrorElementFor(el), "&nbsp;");
}


// returns validation parameters for a given element
function GetValidationParamsFor(el){
	return el ? el.getAttribute('validate') : null;
}


// returns max allowed length parameter 
function GetValidationParam(element, parameter, default_v){
	var full = GetValidationParamsFor(element);
	if (!full) return default_v;
	
	rex = new RegExp(parameter + "\\((.+?)\\)", "i");
	var arr = full.match(rex);
	if (arr && arr.length > 1) 
		return arr[1];
	else
		return default_v;
}


// validates max. allowed length for an input element
function ValidateMax(el){
	var max    = GetValidationParam(el, "max", 64000);
	var result = (el.value.length <= max);
	if (!result)
		ShowErrorFor(el, "Value is too long. Should be less than " + max + " symbols");
	return result;
}

// validates min. allowed length for an input element
function ValidateMin(el){
	var min    = GetValidationParam(el, "min", 0);
	var result = (el.value.length >= min);
	if (!result){
		msg = (min > 1) ? ("Value must be at least " + min + "  symbols") : "The value cannot be blank";
		ShowErrorFor(el, msg);
	}
	return result;
}

// validates a field with credit card number
function ValidateCreditcardField(el, fmt_value){
    alert('Validating credit card!');
    return false;
}


// validates a field with a US phone number.  
function ValidatePhoneField(el, fmt_value){
    try {
        reg1 = /.?[0-9]{3}.?\s?[0-9]{3}.?[0-9]{2}.?[0-9]{2}$/
        phone  = el.value.strip(); 
        if (!reg1.test(phone)){
            ShowErrorFor(el, "You must enter a valid US phone number: XXX-XXX-XXXX");
            return false;
        }
    }
    catch(err) { alert(err); }
    return true;
}


// validates data format for an input element
function ValidateData(el){
	var fmt_value = GetValidationParam(el, "format", 0);  
	switch (fmt_value)
	{
		case "anum" : return ValidateAnumericField(el, fmt_value);
		case "email": return ValidateEmailField(el, fmt_value);
		case "url"  : return ValidateUrlField(el, fmt_value);
		case "num"  : return ValidateNumericField(el, fmt_value);
        case "ccard": return ValidateCreditcardField(el, fmt_value);
        case "phone": return ValidatePhoneField(el, fmt_value);
	}
	return true;
}

// validates an exact value match 
function ValidateCheckbox(el){
	if (el.type != "checkbox") return true;
	var fmt_value = GetValidationParam(el, "checked", "false") == "true";
	if (fmt_value && el.checked != fmt_value)
	{
		ShowErrorFor(el);
		return false;
	}
	return true;
}


// validates one input element
function ValidateInput (element){
	// no validation specified 
	if (GetValidationParamsFor(element) == null) return true;
	ClearErrorFor(element);
	
	return ValidateCheckbox (element) && // validates checkboxes (must be checked)
		   ValidateMin  (element) &&     // validate min&max (range)
		   ValidateMax  (element) && 
		   ValidateData (element);       // validates data format (using regexps)
}


// checks for equality and length of two password fields.
function ValidatePasswords(form) {
	// collect password inputs:
	var passwords = [];	
	$(form).getInputs().each(function(i){
		if (GetValidationParam(i, "format", "") == "password") passwords.push(i);
	});
	if (passwords.length != 2) return true;

	// make sure they're not empty:
	for(i=0; i < passwords.length; i++){
		var f = passwords[i];
		if (IsEmpty(f)){
			ShowErrorFor(f, "Password can't be blank");
			return false;
		}
	}
	 
	// make sure they're identical
	if (passwords[0].value != passwords[1].value) {
		ShowErrorSummaryFor(form, "Passwords do not match");
		return false;
	}
	return true;	
}


// validates a form's input fields before submitting
function ValidateForm(form) {
	try	{
		var result = true;	
		var inputs = $(form).getElements();
		inputs.each(function(i){
			result = ValidateInput(i);
			if (!result) throw $break;		
		});
		return result && ValidatePasswords(form);	
	}
	catch(e) { alert("Error: " + e); }
}


// validates field to be alphanumeric
function ValidateAnumericField(el, fmt_value){
	var result = IsAlphanumeric(el.value); 
	if (!result)
		ShowErrorFor(el, "Only numbers and alphabet characters please.");
	return result;
}

// validates field to be contain valid email
function ValidateEmailField(el, fmt_value){
	var result = IsEmpty(el) || IsValidEmail(el.value);
	if (!result)
		ShowErrorFor(el, "Not a valid email address");
	return result;
}

// validates field to contain valid URL
function ValidateUrlField(el, fmt_value){
	var result = IsValidURL(el.value);
	if (!result)
		ShowErrorFor(el, "Not a valid URL");
	return result;
}


// validates field to be numeric
function ValidateNumericField(el, fmt_value){
	var result = IsNumeric(el.value);
	if (!result)
		ShowErrorFor(el, "Only digits please.");
	return result;
}


function IsEmpty(aTextField) {
  return !(aTextField.value) || (aTextField.value.length==0);
}	


function IsAlphanumeric(str){
  var reg = new RegExp("^[a-zA-Z0-9\040_]+$");
  return reg.test(str);
}


function IsValidURL(str){
  var reg = new RegExp("^((ht|f)tp(s?)\\:\\/\\/|~/|/)?([\\w]+:\\w+@)?([a-zA-Z0-9]{1}([\\w\\-]+\\.)+([\\w]{2,5}))(:[\\d]{1,5})?((/?\\w+/)+|/?)(\\w+\\.[\\w]{3,4})?((\\?\\w+=\\w+)?(&\\w+=\\w+)*)?");
  return reg.test(str);
}


function IsValidEmail(str){
  var reg = new RegExp("^([\\w\\-\\._0-9]+)@((\\[([0-9]{1,3}\\.){3}[0-9]{1,3}\\])|(([\\w\\-]+\\.)+)([a-zA-Z_0-9]{2,4}))$");
  return reg.test(str);
}


function IsNumeric(sText){ 
  var reg = new RegExp("^[0-9]+$");
  return reg.test(sText);
}

// Switches between tabs: "kids-websites-emails"
function SetCurrentTab(tabElement, pageElement){
	// switch actual tab:
	var sibs = $(tabElement).siblings();
	for (i = 0; i < sibs.length; i++){
		if (sibs[i] && sibs[i].hasClassName("current"))
			sibs[i].removeClassName("current");
	}
	$(tabElement).addClassName("current");
	
	// switch the content area:
	var sibs = $(pageElement).siblings();
	for (i = 0; i < sibs.length; i++)
		if (sibs[i])
			sibs[i].hide();
	$(pageElement).show();
	
	// save current tab on the server:
	new Ajax.Request('/dash/set_current_tab', {method: 'get', parameters: {tab_name: tabElement.id}});
}


function SelectKid(elementId)
{    
    // Select the kids' tab....
    var tabElementId = elementId + "_details_id";
	var sibs = $(tabElementId).siblings();
	for (i = 0; i < sibs.length; i++)
	{
		if (sibs[i] && sibs[i].hasClassName("selected"))
			sibs[i].removeClassName("selected");
        if (sibs[i] && !sibs[i].hasClassName("unselected"))
			sibs[i].addClassName("unselected");    			
	}
	var _tab = $(tabElementId); 
	if (_tab.hasClassName("unselected"))
		_tab.removeClassName("unselected");    			
    
    if (!_tab.hasClassName("selected"))
		_tab.addClassName("selected");
    
    // Select the kid's settings..
    var settingsElementId = elementId + "_settings_id";
    
    var sibs = $(settingsElementId).siblings();
	for (i = 0; i < sibs.length; i++)
	{
		if (sibs[i] && sibs[i].hasClassName("selected"))
			sibs[i].removeClassName("selected");
        if (sibs[i] && !sibs[i].hasClassName("unselected"))
			sibs[i].addClassName("unselected");    			
	}
	if ($(settingsElementId).hasClassName("unselected"))
		$(settingsElementId).removeClassName("unselected");    			
    
    if (!$(settingsElementId).hasClassName("selected"))
		$(settingsElementId).addClassName("selected");
		
	// save current tab on the server:
	new Ajax.Request('/dash/set_current_kid', {method: 'get', parameters: {kid_id: elementId}});
}

// shows the 'editor' panel (if hidden). used on the dashboard for editing kids, links and emails
function ShowEditor(editorId){
	var ed = $(editorId);
	if (!ed.visible()){
		ed.show();
		window.setTimeout(function() {focusFirstFormOnPage(editorId)}, 200);
	}
    return ed;
}

// shows 'loading' panel within a given editor
function ShowLoadingPanel(editorId){
    var ed = ShowEditor(editorId);
    $(ed).update ('<div id="loading">Loading... Please wait...</div>');
}


function HideEditor(editorId){
	var ed = $(editorId);
	if (ed)
		ed.hide();
}
