/**
 * Displays an error message if an element of a form hasn't been completed and
 * should be
 *
 * @param   object   the form
 * @param   string   the name of the form field to put the focus on
 *
 * @return  boolean  whether the form field is empty or not
 */
var NS4 = (navigator.appName == "Netscape" && parseInt(navigator.appVersion) < 5);
var NSX = (navigator.appName == "Netscape");
var IE4 = (document.all) ? true : false;

function emptyFormElements(theForm, theFieldName)
{
    var isEmpty  = 1;
    var theField = theForm.elements[theFieldName];
    // Whether the replace function (js1.2) is supported or not
    var isRegExp = (typeof(theField.value.replace) != 'undefined');

    if (!isRegExp) {
        isEmpty      = (theField.value == '') ? 1 : 0;
    } else {
        var space_re = new RegExp('\\s+');
        isEmpty      = (theField.value.replace(space_re, '') == '') ? 1 : 0;
    }
    if (isEmpty) {
        theForm.reset();
        theField.select();
        alert(errorMsg0);
        theField.focus();
        return false;
    }

    return true;
} // end of the 'emptyFormElements()' function


/**
 * Ensures a value submitted in a form is numeric and is in a range
 *
 * @param   object   the form
 * @param   string   the name of the form field to check
 * @param   integer  the minimum authorized value
 * @param   integer  the maximum authorized value
 *
 * @return  boolean  whether a valid number has been submitted or not
 */
function checkFormElementInRange(theForm, theFieldName, min, max)
{
    var theField         = theForm.elements[theFieldName];
    var val              = parseInt(theField.value);

    if (typeof(min) == 'undefined') {
        min = 0;
    }
    if (typeof(max) == 'undefined') {
        max = Number.MAX_VALUE;
    }

    // It's not a number
    if (isNaN(val)) {
        theField.select();
        alert(errorMsg1);
        theField.focus();
        return false;
    }
    // It's a number but it is not between min and max
    else if (val < min || val > max) {
        theField.select();
        alert(val + errorMsg2);
        theField.focus();
        return false;
    }
    // It's a valid number
    else {
        theField.value = val;
    }

    return true;
} // end of the 'checkFormElementInRange()' function


/**
 * This array is used to remember mark status of rows in browse mode
 */
var marked_row = new Array;
/**
 * Sets/unsets the pointer and marker in browse mode
 *
 * @param   object    the table row
 * @param   interger  the row number
 * @param   string    the action calling this script (over, out or click)
 * @param   string    the default background color
 * @param   string    the color to use for mouseover
 * @param   string    the color to use for marking a row
 *
 * @return  boolean  whether pointer is set or not
 */
function setPointer(theRow, theRowNum, theAction, theDefaultColor, thePointerColor, theMarkColor)
{
    var theCells = null;
	 
	 // 0. toggle cell visibility if click
	 if (theAction == 'click')
	 	toggleVis('drow' + theRowNum);

    // 1. Pointer and mark feature are disabled or the browser can't get the
    //    row -> exits
    if ((thePointerColor == '' && theMarkColor == '')
        || typeof(theRow.style) == 'undefined') {
        //return false;
    }

    // 2. Gets the current row and exits if the browser can't get it
    if (typeof(document.getElementsByTagName) != 'undefined') {
        theCells = theRow.getElementsByTagName('td');
    }
    else if (typeof(theRow.cells) != 'undefined') {
        theCells = theRow.cells;
    }
    else {
        //return false;
    }

    // 3. Gets the current color...
    var rowCellsCnt  = theCells.length;
    var domDetect    = null;
    var currentColor = null;
    var newColor     = null;
    // 3.1 ... with DOM compatible browsers except Opera that does not return
    //         valid values with "getAttribute"
    if (typeof(window.opera) == 'undefined'
        && typeof(theCells[0].getAttribute) != 'undefined') {
        currentColor = theCells[0].getAttribute('bgcolor');
        domDetect    = true;
    }
    // 3.2 ... with other browsers
    else {
        currentColor = theCells[0].style.backgroundColor;
        domDetect    = false;
    } // end 3

    // 4. Defines the new color
    // 4.1 Current color is the default one
    if (currentColor == ''
        || currentColor.toLowerCase() == theDefaultColor.toLowerCase()) {
        if (theAction == 'over' && thePointerColor != '') {
            newColor              = thePointerColor;
        }
        else if (theAction == 'click' && theMarkColor != '') {
            newColor              = theMarkColor;
        }
    }
    // 4.1.2 Current color is the pointer one
    else if (currentColor.toLowerCase() == thePointerColor.toLowerCase()
             && (typeof(marked_row[theRowNum]) == 'undefined' || !marked_row[theRowNum])) {
        if (theAction == 'out') {
            newColor              = theDefaultColor;
        }
        else if (theAction == 'click' && theMarkColor != '') {
            newColor              = theMarkColor;
            marked_row[theRowNum] = true;
        }
    }
    // 4.1.3 Current color is the marker one
    else if (currentColor.toLowerCase() == theMarkColor.toLowerCase()) {
        if (theAction == 'click') {
            newColor              = (thePointerColor != '')
                                  ? thePointerColor
                                  : theDefaultColor;
            marked_row[theRowNum] = (typeof(marked_row[theRowNum]) == 'undefined' || !marked_row[theRowNum])
                                  ? true
                                  : null;
        }
    } // end 4

	 if (theAction == 'Click')
	 	//return true;
		return;

    // 5. Sets the new color...
    if (newColor) {
        var c = null;
        // 5.1 ... with DOM compatible browsers except Opera
        if (domDetect) {
            for (c = 0; c < rowCellsCnt; c++) {
                theCells[c].setAttribute('bgcolor', newColor, 0);
            } // end for
        }
        // 5.2 ... with other browsers
        else {
            for (c = 0; c < rowCellsCnt; c++) {
                theCells[c].style.backgroundColor = newColor;
            }
        }
    } // end 5


    //return true;
} // end of the 'setPointer()' function


/**
 * Checks/unchecks all tables
 *
 * @param   string   the form name
 * @param   boolean  whether to check or to uncheck the element
 *
 * @return  boolean  always true
 */
function setCheckboxes(the_form, do_check)
{
    var elts      = (typeof(document.forms[the_form].elements['selected_db[]']) != 'undefined')
                  ? document.forms[the_form].elements['selected_db[]']
                  : document.forms[the_form].elements['selected_tbl[]'];
    var elts_cnt  = (typeof(elts.length) != 'undefined')
                  ? elts.length
                  : 0;

    if (elts_cnt) {
        for (var i = 0; i < elts_cnt; i++) {
            elts[i].checked = do_check;
        } // end for
    } else {
        elts.checked        = do_check;
    } // end if... else

    return true;
} // end of the 'setCheckboxes()' function


/**
  * Checks/unchecks all options of a <select> element
  *
  * @param   string   the form name
  * @param   string   the element name
  * @param   boolean  whether to check or to uncheck the element
  *
  * @return  boolean  always true
  */
function setSelectOptions(the_form, the_select, do_check)
{
    var selectObject = document.forms[the_form].elements[the_select];
    var selectCount  = selectObject.length;

    for (var i = 0; i < selectCount; i++) {
        selectObject.options[i].selected = do_check;
    } // end for

    return true;
} // end of the 'setSelectOptions()' function


function getbyID(id)
{
    var box= '';
    if(document.all && !document.getElementById)
    {
        return box = document.all.id;
    }
    else if(document.getElementById)
    {
        return box = document.getElementById(id);
    }
    else
    {
        return box = document.layers[id];
    }
} 

function getStyleObject(objectId) {
    // cross-browser function to get an object's style object given its id
    if(document.getElementById && document.getElementById(objectId)) {
	// W3C DOM
	return document.getElementById(objectId).style;
    } else if (document.all && document.all(objectId)) {
	// MSIE 4 DOM
	return document.all(objectId).style;
    } else if (document.layers && document.layers[objectId]) {
	// NN 4 DOM.. note: this won't find nested layers
	return document.layers[objectId];
    } else {
	return false;
    }
} // getStyleObject

function changeObjectVisibility(objectId, newVisibility) {
    // get a reference to the cross-browser style object and make sure the object exists
    var styleObject = getStyleObject(objectId);
    if(styleObject) {
	styleObject.visibility = newVisibility;
	return true;
    } else {
	// we couldn't find the object, so we can't change its visibility
	return false;
    }
} // changeObjectVisibility

function moveObject(objectId, newXCoordinate, newYCoordinate) {
    // get a reference to the cross-browser style object and make sure the object exists
    var styleObject = getStyleObject(objectId);
    if(styleObject) {
	styleObject.left = newXCoordinate;
	styleObject.top = newYCoordinate;
	return true;
    } else {
	// we couldn't find the object, so we can't very well move it
	return false;
    }
} // moveObject

function toggleVis2(divname, vis)
{
	var x=getStyleObject(divname), a=toggleVis2.arguments;
	
	if (x!=null && x) {
		if (document.all || document.getElementById) {	// IE & Gecko & Opera
			if ((x.display=="none" && a.length == 1) || (a.length > 1 && a[1] == "show")) // none means show, "" means hide
				x.display=""; // show
			else
				x.display="none"; // hide
		}
		else {	// Netscape 4
			if ((x.display=="show" && a.length == 1) || (a.length > 1 && a[1] == "show"))
				x.display="show";
			else
				x.display="hide";
		}
	}
} // end of the 'toggleVis()' function

/**
  * hides/makes visible a table row
  *
  * @param   string   the element name
	* @param   string		"hide" forces hide, "show" forces show, leave parm out forces toggle
  * @return  boolean  always true
  */
function toggleVis(divname)
{
	var x=MM_findObj(divname), a=toggleVis.arguments;
	
	if (x!=null) {
		if (document.all || document.getElementById) {	// IE & Gecko & Opera
			if ((x.style.display=="none" && a.length == 1) || (a.length > 1 && a[1] == "show")) // none means show, "" means hide
				x.style.display=""; // hide
			else
				x.style.display="none"; // show
		}
		else {	// Netscape 4
			if ((x.display=="show" && a.length == 1) || (a.length > 1 && a[1] == "show"))
				x.display="hide";
			else
				x.display="show";
		}
	}
} // end of the 'toggleVis()' function


/**
  * adds/removes a reference from a category/section/subsection
  *
  * @param   string   the reference number
  * @param   string   the category number
  *
  * @return  <null>
  */
function toggle_group(ref, cat)
{
  var win_url = "group_toggle_for_ref.php?ref=" + ref + "&cat=" + cat;
  var toggle_window = window.open(win_url,"toggle_group","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=1,resizable=1,width=200,height=200");
  if (toggle_window.opener == null) toggle_window.opener = self;
  window.focus();
} // end of the 'toggle_group()' function


/**
  * toggles the plus or minus gif 
  *
  * @param   string   name of the image object to toggle
  *
  * @return  <null>
  */
var plusgif = new Image(8,8); plusgif.src = 'graphics/plus.gif';
var minusgif = new Image(8,8); minusgif.src = 'graphics/minus.gif';
function toggle_plus_minus(imgname)
{
	var x
	if ((x=MM_findObj(imgname))!=null) {
		if (x.src.indexOf('plus') > 0)
			x.src = minusgif.src;
		else
			x.src = plusgif.src;
	}	
} // end of the 'toggle_plus_minus()' function


function checkFields(){

	if(updateFORM.xauthor.value == "") {
		alert("Please fill in the [Authors] for this reference");
		return false; }
	updateFORM.xauthor.value = cleanauthor(updateFORM.xauthor.value, 0);

	if(updateFORM.xtitle.value == "") {
		alert("Please fill in the [Title] for this reference");
		return false; }
	
	updateFORM.xsecondary_author.value = cleanauthor(updateFORM.xsecondary_author.value, 0);

	if (updateFORM.xvolume.value.length > 0) {
		updateFORM.xvolume.value = updateFORM.xvolume.value.replace(".", "");
		updateFORM.xvolume.value = updateFORM.xvolume.value.replace("  ", " ");
		updateFORM.xvolume.value = updateFORM.xvolume.value.replace("  ", " ");
	}
	
	if (updateFORM.xedition.value.length > 0) {
		updateFORM.xedition.value = updateFORM.xedition.value.replace(".", "");
		updateFORM.xedition.value = updateFORM.xedition.value.replace("  ", " ");
		updateFORM.xedition.value = updateFORM.xedition.value.replace("  ", " ");
	}
	
	if (updateFORM.xpages.value.length > 0) {
		updateFORM.xpages.value = updateFORM.xpages.value.replace(".", "");
		updateFORM.xpages.value = updateFORM.xpages.value.replace("pp.", "");
		updateFORM.xpages.value = updateFORM.xpages.value.replace("pp", "");
		updateFORM.xpages.value = updateFORM.xpages.value.replace("  ", " ");
		updateFORM.xpages.value = updateFORM.xpages.value.replace("  ", " ");
	}

	return true;
}

function cleanauthor(txt, maxlen)  {
	cleantxt = txt;
	if (txt != "") {
		starttxt = "";
		while (cleantxt != starttxt) {
			starttxt = cleantxt;
			cleantxt = cleantxt.replace("  ", " ");
			cleantxt = cleantxt.replace(" ;", ";");
			cleantxt = cleantxt.replace("; ",";");
			if (maxlen != 0) {
				cleantxt = cleantxt.substring(0,maxlen);
			}
		}
	}
	return cleantxt;
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && document.getElementById) x=document.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

var varbles = "";
var old_so = "";
function change_so(vbls, prev_so) {
	if (varbles.length == 0) varbles = vbls;
	if (old_so.length == 0) old_so = prev_so;
	var new_so = document.orgFORM.so.options[document.orgFORM.so.selectedIndex].value
	varbles = varbles.replace("so="+old_so,"so="+new_so);
	if (varbles.length == 0)   varbles = varbles + "?so=" + new_so;
	if (varbles.indexOf("so=") == -1) varbles = varbles + "&so=" + new_so;
	old_so = new_so;
	location.replace("webref_organiser.php" + varbles);
}

var old_view = "";
function change_view(vbls, prev_view) {
	if (varbles.length == 0) varbles = vbls;
	if (old_view.length == 0) old_view = prev_view;
	var new_view = document.orgFORM.view.options[document.orgFORM.view.selectedIndex].value
	varbles = varbles.replace("view=" + old_view, "view=" + new_view);
	if (varbles.length == 0) varbles = varbles + "?view=" + new_view;
	if (varbles.indexOf("view=") == -1) varbles = varbles + "&view=" + new_view;
	old_view = new_view;
	location.replace("webref_organiser.php" + varbles);
}

function url_arg( name )
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return "";
  else
    return results[1];
}

var pView = url_arg("view");
//var pView = "print";
function noprint() {
	var i;
	if (pView && pView=="print") 
	{	// switch to printer friendly view
		for (i=1; i<=99; i++) {
			toggleVis2("NOPRINT" + i, "hide");
			toggleVis2("ONLYPRINT" + i, "show");
		}
	}
	else { // switch to web friendly view
		for (i=1; i<=99; i++) {
			toggleVis2("NOPRINT" + i, "show");
			toggleVis2("ONLYPRINT" + i, "hide");
		}
	}
}

function togglePrintView() {
	if (pView=="print")
		pView = "";
	else
		pView = "print";
	noprint();
}
