var sw = new Object();
sw.warn = function(s) { if( s && window['console'] ) window['console'].warn(s); }
sw.cssInputMissing = 'missing';
sw.cssInputBad = 'bad';
sw.cssAjaxError = 'error';
sw.cssAjaxOk = 'ok';
sw.cssAjaxForm = 'ajax';
sw.cssFormMessage = 'responseMessage';
sw.encodeHtml = function( str ) {
	// or ... $('<div/>').text( str ).html();
   var div = document.createElement('div');
   div.appendChild( document.createTextNode(str) );
   return div.innerHTML;
}
sw.getFormFieldValue = function( fld ) {
	var ret;
    if( !fld ) ret = null;
    if ( fld.tagName == 'SELECT' ) {
		if( fld.options.length > 0 ) {
			ret = fld.options[fld.selectedIndex].value;
			//alert( 'selected=' + ret );
		}
	}
    else if ( fld.type == 'checkbox' ) {
		if( fld.checked ) ret = 'on';
	}
    else {
		ret = fld.value;
		if( fld.length > 1 ) alert("Multiple fields not supported");
	}
	return ret;
}
sw.checkFieldValue = function( fname, val, reg ) {
    if( val && reg != null ) {
		//alert( "Checking regstr=" + reg );
        if( !reg.test( val ) ) {
            return false;
        }
        else {
			return true;
		}
    }
	return true;
}
sw.highlightMissingField = function( fld ) {
	$(fld).addClass(sw.cssInputMissing);
}
sw.highlightBadField = function( fld ) {
	$(fld).addClass(sw.cssInputBad);
}
sw.resetFormFieldCss = function( obj ) {
	if( obj.target ) obj = $(obj.target);
	obj.removeClass(sw.cssInputMissing).removeClass(sw.cssInputBad);
}
sw.checkFormFields = function( f, defs ) {
	var ok = true, focus = false;
	if( !f.id ) alert('No form id');
	sw.resetFormFieldCss( $(f).find('input') );
	sw.resetFormFieldCss( $(f).find('textarea') );
	var missing = new Array(), bad = new Array();
    for( var i=0; i<defs.length; i++ )  {
        var def = defs[i];
        var fname = def['name'];
		if( !fname ) alert( "No def name" );
        var humanName= def['humanName'];
		if( !humanName ) humanName = fname;
		var mand = (def['mand'] == '1');
		var fld = f[fname];
		if( !fld ) {
			//alert( "No form field for " + fname );
			continue;
		}
        var val = sw.getFormFieldValue( fld );
	    if( !val && mand && def['inputType'] != 'CheckBox' ) {
			sw.highlightMissingField( fld );
			missing.push( humanName );
			$(fld).click( sw.resetFormFieldCss ).keydown( sw.resetFormFieldCss );
			if( !focus ) { 
				if( def['inputType'] == 'TextBox' ) {
					fld.focus(); 
					focus = true; 
				}
			}
			ok = false;
		}
        else if( !sw.checkFieldValue( fname, val, def['regex'] ) ) { 
			sw.highlightBadField( fld );
			bad.push( humanName );
			$(fld).click( sw.resetFormFieldCss ).keydown( sw.resetFormFieldCss );
			if( !focus ) { 
				if( def['inputType'] == 'TextBox' ) {
					fld.focus(); 
					focus = true; 
				}
			}
			//alert("bad val=" + val + " re=" + def['regex'] );
			ok = false;
		}
    }
	if( !ok ) {
		var msg = 'Please check the value you entered for:\n\n- ';
		msg += missing.concat( bad ).join('\n- ');
		alert( msg );
	}
    return ok;
}
sw.attachSubmit = function( formId, func ) {
	$(document).ready(function(){ 
		$( '#' + formId ).submit( func ); 
	});
}
sw.genericFormSubmit = function( obj ) {
	var f = obj.target;
	//alert(  'obj=' + obj + ' obj.target=' + f.tagName );
	if( f.tagName != "FORM" ) { 
		f = f.form; 
		//if( f ) alert( 'found form from input' );
	}
	sw.normalizeTextBoxes( f );
	var jf = $(f);
	var fid = f.attributes[ 'id' ].value; // get round IE 'id' bug
	//alert( 'Form id is ' + fid );
	var vf = window['v_' + fid];
	//alert("genericSubmit: f=" + f + " obj=" + obj.tagName + " vf=" + vf );
	if( vf ) { 
		if(!vf( f )) {
			return false; 
		}
	}
	else {
		var msg = "Form '" + fid + "' has no vfunc defined";
		alert( msg );
		sw.warn( msg );
	}
	var ajax = jf.is('.'+sw.cssAjaxForm);
	if( !ajax ) {
		return true; // drop out here
	}
	var uf = window['u_' + fid];
	sw.ajaxSendForm( jf, uf );
	return false;
}
sw.getAjaxFormMessage = function( formId ) {
	var jmsg = $( '#'+formId+'ResponseMessage' );
	if( jmsg.size() == 0 ) jmsg = $( '#'+formId+ ' .' + sw.cssFormMessage );
	return jmsg;
}
sw.ajaxSendForm = function( jf, updateFunc ) {
	var formId = jf.attr('id');
	var jmsg = sw.getAjaxFormMessage( formId );
	$.ajax({ 
		type: jf.attr("method"),
		url:  jf.attr("action"), 
		data: jf.formSerialize(), // JQ Form Plugin API
		beforeSend: function() { //setSpinner(jf, true); 
		},
		complete: function() { //setSpinner(jf, false); 
		},
		success: function(r) { 
			if( updateFunc ) updateFunc( true, r ); 
			else if( jmsg ) {
				jmsg.removeClass(sw.cssAjaxError).addClass(sw.cssAjaxOk).show().html( r );
			}
		},
		error:  function(r) { 
			if( updateFunc ) updateFunc( false, r.responseText );
			else if( jmsg ) {
				jmsg.addClass(sw.cssAjaxError).removeClass(sw.cssAjaxOk).show().html( r.responseText );
			}
		}
	});
	return false;
}
sw.fadeout = function( je ) {
	setTimeout( function(){je.toggle("slow")}, 4000 );
}
sw.flashMessage = function( je ) {
	if( je.Pulsate ) je.Pulsate( 300, 3 );
}
sw.normalizeSpace = function( str ) {
	if( str ) {
		str = str.replace( /^\s+/g, "" );
		str = str.replace( /\s+$/g, "" );
		str = str.replace( /( )\s+/g, " " );
	}
	return str;
}
sw.normalizeTextBox = function( box ) {
	box.value = sw.normalizeSpace( box.value );
	return box.value;
}
sw.normalizeTextBoxes = function( form ) {
	for( i=0; i<form.elements.length; i++ ) {
		var el = form.elements[i];
		if( el.type == "text" ) {
			sw.normalizeTextBox( el );
		}
	}
}
sw.removeTextboxSpaces = function( box ) {
	box.value = box.value.replace( /\s+/g, "" );
}
sw.popup = function( url, x, y ) {
	var id = 'pop';
	id = id + (new Date()).getTime();
	var win = window.open( 
		url, 
		id,
		"width="+x+",height="+y+",scrollbars=1,history=0,resizable=1,status=0,menubar=0,"+
		"margintop=0,marginleft=0,marginright=0,marginbottom=0,marginheight=0,marginwidth=0"
	);
	return false;
}
sw.formFields = function( jForm ) {
	return $( 'input,select,textarea,checkbox', jForm );
}