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 show_if_checked(div_to_show_id, check_box_id)
{
  if ($(check_box_id).checked)
  {
    $(div_to_show_id).show();
  }
  else
  {
    $(div_to_show_id).hide();
  }
}


function hide_if_checked(div_to_show_id, check_box_id)
{
  if ($(check_box_id).checked)
  {
    $(div_to_show_id).hide();
  }
  else
  {
    $(div_to_show_id).show();
  }
}

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('validation_summary');
	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); }
}



function ValidateAndSubmitForm(form) {
    try	{
            var result = true;	
            var inputs = $(form).getElements();
            inputs.each(function(i){
                    result = ValidateInput(i);
                    if (!result) throw $break;		
            });
            if (result && ValidatePasswords(form))
            {
                form.submit();
            }
            else
            {
                return result;	
            }
    }
    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){
    if (IsEmpty(el))
    {
	return true;
    }
    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]*\.)?[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}});
}


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

function ClearInput(form_name, input_name)
{
    document.forms[form_name][input_name].value = "";
}

function SelectInput(form_name, input_name)
{
    document.forms[form_name][input_name].focus(); 
    document.forms[form_name][input_name].select();    
}

function ShowEditorRoll(editorId){
	var ed = $(editorId);
	if (!ed.visible()){
		ed.appear();
		window.setTimeout(function() {focusFirstFormOnPage(editorId)}, 200);
	}
    return ed;
}

function HideEditorRoll(editorId){
	var ed = $(editorId);
	if (ed.visible()){
            ed.fade({duration:0.25});
        }    
}

function ShowEditor(editorId){
	var ed = $(editorId);
	if (!ed.visible()){
		ed.show();
		window.setTimeout(function() {focusFirstFormOnPage(editorId)}, 200);
	}
    return ed;
}

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

function ResetDropList(dlId)
{
    var dl = $(dlId);
    if (dl)
	dl.selectedIndex = 0;
}

function ClearEdit(id)
{
    var ed = $(id);
    if (ed)
	ed.value = "";
}



function Spin(id, val)
{
  var edit = $(id);
  if (!edit) return;
  if (edit.value == "")
    edit.value = 0;
  
  var newVal = 0;
  if (IsNumeric($(id).value))
    newVal = parseInt($(id).value);
    
  newVal = newVal + val;
  if (newVal < 0)
    newVal = 0;
  edit.value = newVal;
  
}
