// $Id: addremove.js,v 1.31 2009/03/17 19:58:29 petrow Exp $ 


var newRowsCounter = 1;

// addrow

function addrow(tableid,row) { // row = number of row inside TFOOT that should be cloned
    newRowsCounter++;
//    var src  = document.getElementById(tab).getElementsByTagName("tfoot")[0].getElementsByTagName("tr")[0];
	row ? row=row : row=0;
	var src  = document.getElementById(tableid).getElementsByTagName("tfoot")[0].getElementsByTagName("tr")[row];
    var dest = document.getElementById(tableid).getElementsByTagName("tbody")[0];
    var srcopy = src.cloneNode(true);

//	alert([src,dest,srcopy]);
    retainNames (srcopy.getElementsByTagName("input"));
    retainNames (srcopy.getElementsByTagName("select"));
    retainNames (srcopy.getElementsByTagName("textarea"));
//	alert (srcopy);
    dest.appendChild(srcopy);
    if (typeof suggest == "object") suggest.load();
    return false;
}


// retainNames
// Function adds numeric suffixes to every element that has name parameter. Numeric will suffix follow after "--"

function retainNames (rowcopyFields) {
//	alert (rowcopyFields.length);
//	alert (rowcopyFields[1]);
	for (var i=0; i < rowcopyFields.length; i++) {
//		alert (rowcopyFields[i]);
        var theName = rowcopyFields[i].name;
        if (theName) {
            if (rowcopyFields[i].type == "radio") {
                rowcopyFields[i].value = theName + "--" + newRowsCounter;
            } else {
                rowcopyFields[i].name = theName + "--" + newRowsCounter;
                rowcopyFields[i].id = theName + "--" + newRowsCounter;  // IE can't find just created elements by name, so it needs ID.
            }
        }
    }
}




function collectFields() {
// collecting fields to array
	var allRows = document.getElementsByTagName("tbody")[0].getElementsByTagName("tr");
	allData = new Array(allRows.length);
	for (var i = allRows.length-1; i>-1; i--) {
		var rowEls = allRows[i].getElementsByTagName("*");
		var jj = 3; // number of fields in row (include link)
		var rowData = new Array(jj);
		for (var j = rowEls.length-1; j>-1; j--) {
			if ((rowEls[j].name && rowEls[j].name.match(/File_type/)) || (rowEls[j].name && (rowEls[j].type != "hidden")) || (rowEls[j].nodeName == "A")) {
				rowData[jj-1] = rowEls[j];
				jj--;
			}
		}
		allData[i] = rowData;
	}
}


function duplicates	(type,	// value of first column ('manuscript', 'figure'...)
							label,	// testing value of other column ('manuscript', '1a', '2'...)
							col) {	// column for test (0,1,2...)
	var dup = -1;
	for (var row=0; row < allData.length; row++ ) {
		if ((allData[row][0].value == type) && (allData[row][col].value == label)) {
			dup++;
		}
	}
	return dup; // return number of duplicates or -1 if tested value not present at all
}




// remrow
// Remove the same row in the table where "obj" sits

function remrow(obj,
                radioname,  // radiobuttons name
                hide)       // if presents row will not removed but hided with display:none
{
    // IE find obj
    if (!obj.nodeName) obj = getTargetObj();
    // find tr
    var tr = obj;
    if (tr.nodeName.toLowerCase() != "tr")
        while (tr.nodeName.toLowerCase() != "tr") tr = tr.parentNode;
    // find tbody
    var tbody = tr;
    while (tbody.nodeName.toLowerCase() != "tbody") tbody = tbody.parentNode;
    // find dynamictable object
    var dynatable = tbody.parentNode.parentNode; // ToDo: add class to dynamic table object and than find by class name
	
//  if (hide)
//      tr.style.display = "none";
//  else {
//        if (tbody.getElementsByTagName("tr").length > 1) {
        if (getVisible(tbody.getElementsByTagName("tr")).length > 1) {
            if (hide) tr.style.display = "none";
            else tbody.removeChild(tr);
        } else {
//            resetFields(tr);
            if (hide) tr.style.display = "none";
            else tbody.removeChild(tr);
//            addrow(dynatable.id);
        }
//    }
    if (radioname) checkRadio (radioname);
	
	if (document.getElementById("files")) { // only for Files page
		collectFields();
		var manuscripts = duplicates("manuscript", "manuscript", 0);
		if (manuscripts < 0) {
			addrow('files',0); recalcCSS();
		}
	}
}


function getParentElement(obj,tag) {
    while (obj.nodeName.toLowerCase() != tag) obj = obj.parentNode;
    return obj;
}


function getVisible (objects) {
    var visible = [];
    for (var i=0; i < objects.length; i++) {
        if (objects[i].style.display != "none") {
            visible.push( objects[i] );
        }
    }
    return visible;
}


function resetFields(zone) {
    // clearing all inputs with type text or file
    var allinputs = zone.getElementsByTagName("input");
    for (var i=0; i < allinputs.length; i++) {
        if (allinputs[i].type == "text" || allinputs[i].type == "file" ) {
            allinputs[i].value = "";
        } else if (allinputs[i].type == "checkbox") {
            allinputs[i].checked = false;
        }
    }
    // reseting all selects to first option
    var allselects = zone.getElementsByTagName("select");
    for (var i=0; i < allselects.length; i++) {
        allselects[i].selectedIndex = 0;
    }

}



function SetField(n,val) {
  if(document.getElementsByName(n)) {
     document.getElementsByName(n)[0].value=val;
  }
}   


function checkRadio (radioname) {
    var checked = true;
    var fields = document.getElementsByName(radioname);
    for (var i=1; i < fields.length; i++) {
        if (fields[i].checked && (fields[i].parentNode.parentNode.style.display != "none")) {
            return;
        }
        else {
            checked = false;
        }
    }
    if (! checked)
        resetRadio(radioname);
}


function resetRadio (radioname) {
    var checked = false;
    var allradio = document.getElementsByName(radioname);
    for (var j=0; j < allradio.length; j++ ) {
        if ((allradio[j].style.display != "none") && (checked == false)) {
//        if (allradio[j].style.display != "none") {
//			opera.postError ("on");
            allradio[j].checked = true;
            checked = true;
        }
        else {
//			opera.postError ("xxx");
            allradio[j].checked = false;
        }
    }
}


function countChecked (zone) {
	var checked = 0;
	for (var i=0; i < zone.length; i++)
		if (zone[i].checked == true) checked++;
	return checked;
}

function getChecked (zone) {  // Only radios now; return one radio or false
	var checked = false;
	for (var i=0; i < zone.length; i++) {
		if (zone[i].checked == true)
			checked = zone[i];
	}
	return checked;
}



function DisableEnableToggler(trigger, name) {
    var objs = document.getElementsByName(name);
    for (var j=0; j < objs.length; j++ ) {
        objs[j].disabled = trigger;
    }
}



// showField
// Show or hide specific field with name start with "file_desc" depend on selected value of "obj"

function showField(obj,field) {
    var nameSuf = obj.name.slice(obj.name.indexOf("-"));
    var controlField = document.getElementById(field + nameSuf);
    if (obj.selectedIndex != 0 )
        controlField.style.display = "block";
    else {
        controlField.style.display = "none";
        var promt = controlField.nextSibling;
        while (promt.nodeType != 1) promt = promt.nextSibling;
        promt.style.display = "none";
    }
}


// showRow for submitter as PI


// fieldsRearrange
// Copy all fields with name start with "_" to "hiddenPlace" hidden field as value

function fieldsRearrange (hiddenPlace) {

return;

    var hiddenPlace = document.getElementById(hiddenPlace).getElementsByTagName("input")[0];
    hiddenPlace.value = "";
    var allEl = document.getElementsByTagName("tbody")[0].getElementsByTagName("*");
    var writeBuffer, newElement;
    for (var i=0; i < allEl.length; i++) {
        if (allEl[i].name && (allEl[i].name.charAt(0) == "_")) {
            writeBuffer = document.getElementsByName(allEl[i].name);
            newElement = "&" + allEl[i].name.slice(1) + "=";
            if (allEl[i].type == "file") newElement += URLencode(extractFilename(allEl[i].value));
            else (allEl[i].value == "Enter number...") ? newElement += "" : newElement += URLencode(allEl[i].value);
            hiddenPlace.value += newElement;
        }
    }
}




function URLencode(sStr) {
    return escape(sStr).replace(/\+/g, '%2C').replace(/\"/g,'%22').replace(/\'/g, '%27');
}


function extractFilename(what) {
    if (what.indexOf("/") > -1)
        answer = what.substring(what.lastIndexOf("/")+1,what.length);
    else
        answer = what.substring(what.lastIndexOf("\\")+1,what.length);
    return answer
}


// trimSpaces
// Trim spaces in string

function trimSpaces(targetString,trimMode) {
    // 0 = trim begin and end
    // 1 = trim begin only
    // 2 = trim after only

    var iPos
    iPos=0
    if (trimMode==0 || trimMode==1)
    {
        if (targetString.charAt(iPos)==" ")
        {
            while(targetString.charAt(iPos)==" ")
            {
                iPos++
            }
            targetString = targetString.substr(iPos)
        }
    }

    iPos = targetString.length-1
    if (trimMode==0 || trimMode==2)
    {
        if (targetString.charAt(iPos)==" ")
        {
            while(targetString.charAt(iPos)==" ")
            {
                iPos--
            }
            targetString = targetString.substr(0,iPos+1)
        }
    }
    return targetString
}


// className functions

function addClass(element, className) {
	if (!hasClass(element, className)) {
		if (element.className) element.className += " " + className;
		else element.className = className;
	}
}

function removeClass(element, className) {
	var regexp = new RegExp("(^|\\s)" + className + "(\\s|$)");
	element.className = element.className.replace(regexp, "$2");
}

function hasClass(element, className) {
	var regexp = new RegExp("(^|\\s)" + className + "(\\s|$)");
	return regexp.test(element.className);
}

function toggleClass(element, className) {
	if (hasClass(element, className)) removeClass(element, className);
	else addClass(element, className);
}


// this function is needed to work around 
// a bug in IE related to element attributes
function hasClass2(obj) {
   var result = false;
   if (obj.getAttributeNode("class") != null) {
       result = obj.getAttributeNode("class").value;
   }
   return result;
}



function showhide (obj,     // *required* object Id name or object itself
                   action ) // true - show
                            // false - hide
                            // not present - switch
{
    if (obj = objTry(obj)) {
		if (arguments[1] == null) {
			if (obj.style.display) {
//				alertt (obj.nodeName + " ----> " + obj.style.display + "<----");
				obj.style.display == "none" ? obj.style.display = "" : obj.style.display = "none";
			} else {
				if (obj.currentStyle) { // IE way
//					alertt ("currentStyle " + obj.currentStyle.display);
					obj.currentStyle.display == "none" ? obj.style.display = "block" : obj.style.display = "none";
				} else if (document.defaultView && document.defaultView.getComputedStyle) { // Standard way
//					alertt ("getComputedStyle " + document.defaultView.getComputedStyle(obj, '').getPropertyValue("display"));
					document.defaultView.getComputedStyle(obj, '').getPropertyValue("display") == "none" ? obj.style.display = "block" : obj.style.display = "none";
//					document.defaultView.getComputedStyle(obj, '').getPropertyValue("display") == "none" ? obj.style.display = showhidet(obj.tagName) : obj.style.display = "none";
				}
			}
		} else {
//			alertt (obj.type + " ====> " + arguments[1]);
//			alertt ("obj.style.display = " + obj.style.display);
			arguments[1] == true ? obj.style.display = "block" : obj.style.display = "none";
		}
		return false
	}
}


function showhidet (oType) {
	switch (oType) {
		case "TABLE":
			return "table";
		case "TR":
			return "table-row";
		default:
			return "block";
	}

}






function show (obj) {
	if (obj = objTry(obj)) {
		

	}
}


function objTry (o) { // input: object or object's ID; output: object
    if (typeof(o)!="object") {
    	if (document.getElementById) {
			if (o = document.getElementById(o)) {}
			else return false;
		}
	}
	return o;
}





// addEvent(window, 'load', foo);
/*
function addEvent(obj, evType, fn) {
    if (obj.addEventListener) {
        obj.addEventListener(evType, fn, false); 
        return true; 
    } else if (obj.attachEvent) {
        var r = obj.attachEvent("on"+evType, fn);
        return r;
    } else {
        obj['on' + evType] = fn;
    } 
}
*/


function getTargetObj (e) {
    var oTarget;
    var e = window.event;
    if ( e == null ) return null;
    if ( e.srcElement != null ) {
        oTarget = event.srcElement;
    } else {
        oTarget = e.target;
    }
    while ( oTarget && oTarget.nodeType != 1 ) oTarget = oTarget.parentNode;
    return oTarget;
}




/* Debug */
function alertt (message) {
if (window.opera) {
	opera.postError (message)
} else {
	printfire (message);
}
}

function printfire()
{
    if (document.createEvent)
    {
        printfire.args = arguments;
        var ev = document.createEvent("Events");
        ev.initEvent("printfire", false, true);
        dispatchEvent(ev);
    }
}