var JS_GLOBALS = new Object();

jQuery.fn.checkAll = function(mode) {
   var mode = mode || 'on';
   return this.each(function() {
     switch(mode) {
       case 'on':
         this.checked = true;
         break;
       case 'off':
         this.checked = false;
         break;
       case 'toggle':
         this.checked = !this.checked;
         break;
     }
   });
 };

/*-----------------------------------------------------------------------------
General Ajax
-----------------------------------------------------------------------------*/
function setSpinner( je, onOff ) { // je is usually a form or anchor
	var manual = false;
	var jm = getMessageElement( je );
	/*
	var jspin; // the spinner itself
	var id = je.get(0).id;
	var jpos = id ? $( "#" + id + "_spinner" ) : null;
	if( !jpos || jpos.size() == 0 ) jpos = je.find( ".spinnerCont" ); // spinner container element
	if( jpos.size() == 1 ) {
		manual = true;
		jspin = jpos.find(".spinner"); // the spinner child image
	}
	else {
		manual = false;
		jpos = findInsertionPoint( je ); // find the button that was pressed
		jspin = jpos.parent().find(".spinner"); // find the closest sibling spinner
	}
	*/
	if( onOff ) {
		var elImg = document.createElement( "img" );
		elImg.src = JS_GLOBALS.SPINNER_SRC || alert("No spinner set"); 
		$(elImg).addClass('spinner');
		/*
		if( manual ) jpos.append( elImg );
		else jpos.after( elImg );
		*/
		jm.append( elImg );
	}
	else if( !onOff ) {
		/*jspin.remove();*/
		var img = jm.find("img.spinner");
		if( img ) img.remove();
	}
}

function findInsertionPoint( je ) { // je is a parent like a form etc
	var jm = je.find(".sub");
	if( jm.size() == 0 ) jm = je.find("input[@type='submit']");
	if( jm.size() == 0 ) jm = je.find("input[@type='image']");
	if( jm.size() == 0 ) {
		warn("no submit or image button found, will use parent of anchor/form");
		jm = je.parent();
	}
	return jm;
}

function getMessageElement( je ) { // find a place to put messages under this element
	if( je.is( ".updateMsg" ) ) {
		return je;
	}
	var id = je.get(0).id;
	//alert("getMessageElement formId=" + id);
	var jm = id ? $( "#" + id + "_msg" ) : null;
	if( !jm || jm.size() == 0 ) {
		//alert("No jm: je=" + je.get(0) ) ;
		jm = je.find(".updateMsg");
	}
	if( jm.size() == 0 ) {
		var jpos = findInsertionPoint( je );
		//alert( "creating new msg for first time" );
		var elMsg = document.createElement("span");
		if( id ) elMsg.id = id + "_msg";
		jm = $(elMsg);
		jm.addClass('updateMsg');
		jpos.after( jm );
	}
	return jm;
}

function showAjaxMessage( je, text, isError ) {
	var jm = getMessageElement( je );
	var className = isError ? "updateError" : "updateOk";
	var otherClassName = !isError ? "updateError" : "updateOk";
	//alert("in showAjaxMessage className = " + className + " isError = " + isError );
	jm.removeClass( otherClassName ).addClass( className ).html( text );
	if( jm.is(".fademsg") ) { fademsg( jm ); }
	//else alert("No a fademsg: " + jm.get(0) );
}

function fademsg( je ) {
	setTimeout( function(){je.toggle("slow")}, 1000 );
}

function flashMessage( je ) {
	je.Pulsate(800,1);
	setTimeout( function(){je.toggle("slow")}, 4000 );
}

// opts are anchor, updateFunc, okResultId, errResultId
function sendAjaxLink( opts ) {
	if( !opts ) alert("no opts");
	var anchor = opts['anchor'];
	var je = $(anchor);
	var updateFunc = opts['updateFunc'];
	var noSpinner = opts['noSpinner'];
	var htmlTarget = opts['htmlTarget'];
	$.ajax({ 
		type: "GET",
		url:  anchor.href, 
		beforeSend: function() { if(!noSpinner) setSpinner(je, true); },
		complete: function() { if(!noSpinner) setSpinner(je, false); },
		success:
			  function(data) {
				if( htmlTarget ) {
					$('#'+htmlTarget).html( data );
				}
				else {
					var show = updateFunc ? updateFunc(data) : true;
					//alert( "uf=" + uf + " show=" + show );
					if( show ) showAjaxMessage(je, data, false );
				}
			  },
		error:
			  function(data) {
				showAjaxMessage(je, data.responseText, true );
			  }
	});
	return false;
}

function sendDelete( anchor, id, warningMsg ) {
	if( !areYouSure( warningMsg ) ) return false;
	sendAjaxLink({
		'noSpinner':true,
		'anchor': anchor, 
		'updateFunc': function( data ) {
			$('#'+id).remove();
			return false;
		}
	});
	return false;
}

function genericSubmit( obj ) {
	var f;
	if( obj.tagName == "FORM" ) { f = obj; }
	else { f = obj.target; } 
	var jf = $(f);
	var ajax = jf.is(".ajax");
	var uf = window['update_' + f.id];
	var vf = window['validate_' + f.id];
	//alert("genericSubmit: f=" + f + " obj=" + obj.tagName + " uf=" + uf );
	if( vf ) { 
		if(!vf( f )) {
			return false; 
		}
	}
	else warn("Form '" + f.id + "' has no vfunc defined");
	if( !ajax ) return true; // drop out here
	$.ajax({ 
		type: f.getAttribute("method"),
		url:  f.getAttribute("action"), 
		data: jf.formSerialize(), 
		beforeSend: function() { setSpinner(jf, true); },
		complete: function() { setSpinner(jf, false); },
		success:
			  function(data) {
				var show = uf ? uf(data) : true;
				//alert( "uf=" + uf + " show=" + show );
				if( show ) showAjaxMessage(jf, data, false);
			  },
		error:
			  function(data) {
				//alert( "ajax error occurred" );
				showAjaxMessage(jf, data.responseText, true);
			  }
	});
	return false;
}

function sendForm( f, resDiv ) {
	var jf = $(f);
	$.ajax({ 
		type: f.getAttribute("method"),
		url:  f.getAttribute("action"), 
		data: jf.formSerialize(), 
		beforeSend: function() { setSpinner(jf, true); },
		complete: function() { setSpinner(jf, false); },
		success: function(data) { $(resDiv).html( data ); },
		error:  function(data) { showAjaxMessage(jf, data.responseText, true); }
	});
}

function warn(s) { if( s && window['console'] ) window['console'].warn(s); }

function findOrCreateSibling( el, tagName, className ) {
	var p = el.parentNode;
	var elMsg = getSingleChildByClassName( p, tagName, className );
	if( !elMsg ) {
		elMsg = document.createElement( tagName );
		elMsg.className = className;
		p.appendChild( elMsg );
	}
	return elMsg;
}

function removeSibling( el, tagName, className ) {
	var p = el.parentNode;
	var elMsg = getSingleChildByClassName( p, tagName, className );
	if( elMsg ) p.removeChild( elMsg );
}

function extractPaging( str ) {
	var ret = new Object();
	var re;
	re = /_pn=(\d+)/;
	if( str ) {
		var arr = re.exec( str );
		ret.pn = arr[1];
	}
	else ret.pn = "1";
	//alert( "pn=" + ret );
	return ret;
}

/*-----------------------------------------------------------------------------
General DOM helpers
-----------------------------------------------------------------------------*/
function getById(id) { return document.getElementById(id); }
function deleteMe() { this.parentNode.removeChild(this); }
function require( val, msg ) {
	if( !val ) alert( msg );
	return val;
}
function newText( t ) {
	return document.createTextNode( t )
}
function addText( el, t ) {
	el.appendChild( document.createTextNode( t ) );
	return el; 
}
function setText( el, t ) {
	removeChildren( el );
	return addText( el, t ); 
}
function findParentByClass( el, className ) {
	if( el.className == className ) {
		return el;
	}
	else {	//alert( "p=" + el.parentNode.tagName + " " + el.parentNode.className );
	  return el.parentNode ? findParentByClass( el.parentNode, className ) : null;
	}
}
function removeChildren( parent ) {
	while ( parent.hasChildNodes() ) { parent.removeChild(parent.firstChild); }
}
function getSingleChildByClassName(el, tagName, className ){
	var arr = getElementsByClassName( el, tagName, className );
	if( arr.length > 0 ) return arr[0];
	else return null;
}
function getSingleChildByTagName( el, tagName ){
	var arr = el.getElementsByTagName( tagName );
	if( arr.length > 0 ) return arr[0];
	else return null;
}
/* e.g. getElementsByClassName(document, "*", "click-me"); */
function getElementsByClassName( el, tagName, className ){
    var ret = new Array();
	if( !el) alert( "el is mandatory cn=" + className );
	else if( !tagName ) alert( "tagName is mandatory" );
	else if( !className ) alert( "className is mandatory" );
	else {
		var arr = el.getElementsByTagName( tagName );
		className = className.replace(/\-/g, "\\-");
		var oRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)");
		var el;
		for(var i=0; i<arr.length; i++){
			el = arr[i];      
			if(oRegExp.test(el.className)){
				ret.push( el );
			}   
		}
	}
    return ret;
}

/*-----------------------------------------------------------------------------
Validation.
-----------------------------------------------------------------------------*/
function missing_field( f ) {
	alert( "Field " + f.name + " is mandatory" );
}

function bad_field( f ) {
	alert( "Please check the text you entered for " + f.name );
}
function areYouSure( action ) {
	var msg = "Are you sure you want to " + (action == null || ""==action ? " perform this action?" : (action + "?") );
	return confirm( msg );
}
function forceSave() { 
     alert("Please right click and save the file to your computer."); 
	 return false;
}
function showJsRegions( containerElement ) { 
	if ( !containerElement ) {
		containerElement = document;
	}
	var arr = getElementsByClassName( containerElement, "*", "javascript" );
    for( var i=0; i<arr.length; i++ ){
        var el = arr[i];      
		el.style.visibility = "visible";
	}
}
function changeImageSize( url, oldSize, newSize ) {
	var regex = new RegExp( "/" + oldSize + "/" );
	return url.replace( regex, '/' + newSize + '/' );
}
function normalizeSpace(str) {
	if( str ) {
		str = str.replace( /^\s+/g, "" );
		str = str.replace( /\s+$/g, "" );
		str = str.replace( /( )\s+/g, " " );
	}
	return str;
}
function normalizeTextBox( box ) {
	box.value = normalizeSpace( box.value );
	return box.value;
}
function removeSpace( box ) {
	box.value = box.value.replace( /\s+/g, "");
}
function normalizeTextBoxes( form ) {
	for( i=0; i<form.elements.length; i++ ) {
		var el = form.elements[i];
		if( el.type == "text" ) {
			el.value = normalizeSpace( el.value );
		}
	}
}
function checkField( displayName, field, regex, mandatory ) { 
	//alert( "field=" + field.name  + " val=" + field.value + "mand=" + mandatory);
	if( mandatory && field.value == "" ) {
		alert( "No value for required field '" + displayName + "'");
		return false;
	}
	if( regex.length > 0 && field.value != "" ) {
		var regexp = eval( "/" + regex + "/" ); 
		if( !regexp.test( field.value ) ) {
			alert( "Please check the value you entered '" + field.value + "' for '" + displayName + "'" );
			field.focus();
			return false;
		}
	}
	return true;
}
function checkFieldEmpty( form, field, fieldDesc ) { 
	if( field.value == "" || field.value == "UNSET" ) {
		alert( "Please check the value you entered for " + fieldDesc );
		field.focus();
		return false;
	}
	return true;
}
function checkFieldLength( displayName, field, minSize, maxSize ) { 
	if( field.value.length < parseInt(minSize) ) {
		alert( "The value you entered for " + displayName + " is too short (must be at least " + minSize + " chars)" );
		field.focus();
		return false;
	}
	if( field.value.length > maxSize ) {
		alert( "The value you entered for " + displayName + " is too long (must be at most " + maxSize + " chars)" );
		field.focus();
		return false;
	}
	return true;
}
function checkAllSelectInForm( theForm ) {
	var i=0;
	for(i=0;i<theForm.elements.length;i++) {
    	if(theForm.elements[i].value=="UNSET") {
        	alert("Please ensure you have made a selection in all the select boxes");
            theForm.elements[i].focus();
            return false;
        }
    }
	return true;
}

/*-----------------------------------------------------------------------------
Misc. 
-----------------------------------------------------------------------------*/
function doPopup( url, width, height, scrollable ) {
	var id = 'pop';
	id = id + (new Date()).getTime();
	var win;
	var str = "win=window.open( url, '" + id + "', " +
		"'width=" + width + ",height="+height+",scrollbars="+scrollable+",history=0,resizable=1,status=0" +
		",menubar=0,margintop=0,marginleft=0,marginright=0,marginbottom=0,marginheight=0,marginwidth=0'	)";
	eval( str );
	return false;
}
function formatCurrency(num) {
	var objRegExp = new RegExp('(-?\[0-9]+)([0-9]{3})');
	num = num.toString().replace(/\,/g,"");
	num = !isNaN(num) ? Math.round(num * 100) / 100 : 0;
	num.toString().indexOf(".") == -1 ? num += ".00" : void 0;
	while(/\.\d{0,1}$/.test(num)) num += "0";
	while(objRegExp.test(num)) num = num.toString().replace(objRegExp,'$1,$2');
	return num;
}
function round2(num) {
	return Math.round(num * 100) / 100;
}
function toggleVis(el,size) {
	if( el.style.visibility == 'hidden' ) {
		el.style.height = size;
		el.style.visibility = 'visible';
	}
	else if ( el.style.visibility == 'visible' ) {
		el.style.height = '0px';
		el.style.visibility = 'hidden';
		el.style.z_index = 1;
	}
}
function toggleVis(el) {
	var alt=(el.style.visibility == "hidden"?"visible":"hidden");
	el.style.visibility = alt;
}

/*-----------------------------------------------------------------------------
Rollovers
-----------------------------------------------------------------------------*/

function overButt( butt ) {
	var src = butt.src;
	butt.src = src.replace( /\.gif$/, "_on.gif" );
}
function outButt( butt ) {
	butt.src = butt.src.replace( /_on\.gif$/, ".gif" );;
}

/*-----------------------------------------------------------------------------
Old style image preloading

1. At top of page call preloadImages() as follows:
	<script language="JavaScript" type="text/javascript">//<![CDATA[
		preloadImages(new Array(
			"../../images/common/continue_shopping-over.jpg",
			"../../images/common/next_step_button-over.jpg"
		));
	//]]>
	</script>

2. Then use rollOver/rollOut functions which take an HTML img element and a filename
	onmouseover="rollOver(this.firstChild, '../../images/common/next_step_button-over.jpg'); return true;"
	onmouseout="rollOut(this.firstChild, '../../images/common/next_step_button.jpg'); return true;"
	
-----------------------------------------------------------------------------*/
var preloadFlag = false; // are we loaded yet
var preloaded = new Array(); // stores the filenames

function preloadImage( fileName ) {
	if (document.images) {
		preloaded[ fileName ] = newImage( fileName );
	}
}
function preloadImages( arr ) {
	if (document.images) {
		for( var i = 0 ; i<arr.length; i++ ) {
			preloadImage( arr[i] );
		}
		preloadFlag = true;
	}
}
function newImage(arg) {
	if (document.images) {
		var rslt = new Image();
		rslt.src = arg;
		return rslt;
	}
}
function rollOver( img, fileName ) {
	if (document.images && (preloadFlag == true)) {
		var image = preloaded[fileName];
		if( image == null ) {
			//alert("rollover image has not been preloaded: " + fileName);
		}
		else {
			//alert("setting src for " + img + " to " + image.src);
			img.src = image.src;
		}
	}
	else {
		//alert( "document.images=" + document.images );
	}
}
function rollOut( img, fileName ) {
	img.src = fileName;
}
function getFormVars( form ) {
	var o = new Object(); //{ 'a':'b' };
	o.ajax = 1;
	for( var i=0; i<form.elements.length; i++ ) {
		var f = form.elements[i];
		if( f.name && f.value ) {
			if( f.type == 'checkbox' ) {
				if( f.checked ) o[f.name] = f.value;
			}
			else {
				o[f.name] = f.value;
			}
		}
	}
	return o;
};
DivToggler = function() {
	var args = arguments;
	this.divIds = args;
	var oThis = this;
	var seldiv;
	var curr = "" + window.location;
	for( var i=0; i<this.divIds.length; i++ ) {
		var divId = this.divIds[i];
		var jq = $("#toggle_"+divId);
		jq.click(function(){return oThis.show(this.id);});
		if( curr.indexOf('seldiv='+divId) != -1 ) {
			seldiv = divId;
		}
	}
	if( !seldiv ) seldiv = args[0];
	$(document).ready( function(){ oThis.show(seldiv,false)} );
};
DivToggler.prototype = {
	show: function (divId,slide) {
		undefined != slide || (slide= true);
		var theDivId = divId.replace(/^toggle_/,'');
		for( var i=0; i<this.divIds.length; i++ ) {
			var divId = this.divIds[i];
			if( divId != theDivId ) {
				$('#'+divId).hide();
			}
		}
		if( slide ) $('#'+theDivId).slideDown(); // jq builtin
		else { $('#'+theDivId).show();}
		return false;
	}
}
function showProps( obj ) {
	var sb= "";
	for( var p in obj ) { sb = sb + " " + p; }
	alert( sb );
}
function getSelboxValue( sel ) {
	return sel.options[sel.selectedIndex].value;
}
$(document).ready( function(){ 
	$('.jsonly').removeClass('jsonly');
	$('form').submit( genericSubmit );
});

