// Copyright (c) the partners of MetaClass, 2003, 2004, 2005
// Licensed under the Academic Free License version 2.0

//this file should not contain any application- or installation specific code
//for example localization-specific code should be factored out and overridden in
//specific.js 

function inArray(myArray, myElem) {
	for (i=0; i<myArray.length; i++) {
		if (myArray[i]==myElem) {
			return true;
		}
	}
	return false;
}

function getElement( elementId)
    {
    var element;

    if (document.all) {
        element = document.all[elementId];
        }
    else if (document.getElementById) {
        element = document.getElementById(elementId);
        }
    else element = -1;

    return element;
}

// table data link, follows link from table item to its editpage
function tdl(obj, itemId) {
	document.location.href = tdlGetHref(obj, itemId);
}

function tdlGetHref(obj, itemId) {
	dirTypeAndContext = obj.parentNode.parentNode.parentNode.id;
	arr = dirTypeAndContext.split('*');
	link = '../'+arr[0]+'index.php?pntType='+arr[1]+'&id='+itemId;
	if (pntFootprintId != null)
		link = link + '&pntRef=' + pntFootprintId; //important because IE does not pass HTTP_REFERER from javascript
//  phpContext depricated here, we now rely on context scouting
//	if (arr[2] != '')
//		link = link + '&pntContext='+arr[2]+'*'+arr[3]+'*'+arr[4];
	return link;
}

// clears dialog widget inputs in form of ObjectEditDetailsPage
function clrDialogWidget(idKey, labelKey)
{
	theForm = document.detailsForm;
	theForm[idKey].value = '';
	theForm[labelKey].value = '';
}

function getParentNodeByTagName(elem, tagName)
{
	while (elem.tagName != tagName) {
		elem = elem.parentNode;
	}
	return elem;
}

function getNodeByTagName(arr, tagName, index) {
	count = 0;
	for (i=0; i<arr.length; i++) 
		if (arr[i].tagName == tagName) {
			if (count == index)
				return arr[i];
			else 
				count ++;
		}
	return null;
}

function invertTableCheckboxes(aButton)
{

	var aTableSection = getParentNodeByTagName(aButton, 'TABLE');
	var elements = aTableSection.getElementsByTagName("input");
	for (i=0; i<elements.length; i++) {
		if (elements[i].type=="checkbox") {
			if (elements[i].checked) {
				elements[i].checked=false;
			} else {
				elements[i].checked=true;
			}
		}
	}

}

function getObjectHtmlTag(myObj) {
	return myObj.outerHTML.replace(myObj.innerHTML,'');
}

//piece of code for replacing keypad . with ,
//this is the international version that does nothing. see specific.js
var metLK;
function metKD(evt) {
    metLK = evt.keyCode;
}
function metKP(evt) {
	//international version does nothing
}
//end of piece

function scaleContent()
{
	//default implementation: ignore
}

function pntTabSelected(allTabs, selected)
{
	 for (var i=0; i<allTabs.length; i++) {
	 	var contentDiv = getElement(allTabs[i] + 'Content');
	 	var tabDiv = getElement(allTabs[i] + 'Tab');

	 	if (allTabs[i] == selected) {
	 		tabDiv.className='pntTab_selected';
	 		contentDiv.style.display='block';
	 	} else {
	 		tabDiv.className='pntTab';
	 		contentDiv.style.display='none';
	 	}
	}
	scaleContent();
}


function pntPrint_r(what) {
    var output = '';
    for (var i in what)
        output += i+ ' = ' + what[i] + '\n';
    return(output);
}

function pntGetFormValues(aForm) {
	if (!aForm) return null;
	var vals = Array();

	for (i=0; i<aForm.elements.length; i++) {
		vals[aForm.elements[i].name] = aForm.elements[i].value;
	}
	return vals;
}

function pntArraysEqual(first, second) {
	if (first.length != second.length) return false;
	for (i in first) {
//		if (first[i] != second[i]) alert(""+ i + " '" + first[i] + "' != '" + second[i] + "'");
		if (first[i] != second[i]) return false;
	}
	return true;
}

function pntSelectionReport() {
	var elements = document.itemTableForm.getElementsByTagName("input");
	for (i=0; i<elements.length; i++) {
		if (elements[i].type=="checkbox") {
			if (elements[i].checked) {
				document.itemTableForm.pntHandler.value='SelectionReportPage'; 
				document.itemTableForm.submit();
				return;
			}
		}
	}
	popUpWindowAutoSizePos(document.location.href + '&pntLayout=Report');
}

function pntGetFilterFormVisible() {
	div = getElement('simpleFilterDiv');
	if (div.style.display == 'block') 
		return document.simpleFilterForm;
	else 
		return document.advancedFilterForm;
}

function pntFfpColSort( paths ) {
	form = pntGetFilterFormVisible();
	same = true;
	for (i=0; i<paths.length; i++) {
		element = form.elements['pntS' + (i+1)];
		if (element.value != paths[i]) same = false;
		element.value=paths[i];
	}
	if (same && form.elements['pntS1d'].value == 'ASC')
		direction = 'DESC';
	else
		direction = 'ASC';
	for (i=0; i<paths.length; i++) 
		form.elements['pntS' + (i+1) + 'd'].value = direction;
	form.pntSiS.value = '1';
	form.submit();
}

function pntSaveMtoNPropTableState(propNameAndTableId) {
	itemTable = getElement(propNameAndTableId[1]);
	tbody = getNodeByTagName(itemTable.childNodes, 'TBODY', 0);
	var ids = '';
	for (i=0; i<tbody.rows.length; i++) {
		if (i > 0) ids = ids + ';';
		ids = ids + tbody.rows[i].id;
	}
	document.detailsForm[propNameAndTableId[0]].value=ids;
} 

function pntSubmitDetailsForm() {
	pntFormRefData = null; 
	document.detailsForm.submit();
}

function pntSaveEditors() {
}
function pntVerifyAndDelete(formName, oid, delConfQ, dialogWidht, dialogHeight) {
	if (oid.length==0) {
		if (confirm(delConfQ))
			return pntSubmitDelete();
	} else {
		var frm = document.forms[formName]; 
		selectedParams = "&*!@" + oid + "=1";
		pntVerifyAndDeleteDialog(frm, selectedParams, dialogWidht, dialogHeight);
	}
}
function pntVerifyAndDeleteMarked(formName, noItemsMarkedMessage, dialogWidht, dialogHeight) {
		var selectedParams = '';
		var frm = document.forms[formName]; 
		var els = frm.getElementsByTagName("input");
		for (i=0; i<els.length; i++) {
			if (els[i].type=="checkbox" && els[i].checked) {
				selectedParams = selectedParams+'&'+els[i].name+"=1";
			}
		}
		if (selectedParams=='')
			return alert(noItemsMarkedMessage);;
		if (selectedParams.length > 1900) 
			return alert("ERROR: Too many items selected"); //HACK - shoud POST the form to VerifyDeletePage but that page is NYI
			
		pntVerifyAndDeleteDialog(frm, selectedParams, dialogWidht, dialogHeight);
}
function pntVerifyAndDeleteDialog(frm, selectedParams, dialogWidht, dialogHeight) {
		var dialogUrl = "index.php?pntHandler=VerifyDeleteDialog";
		dialogUrl += "&pntType=" + frm.pntType.value;
		dialogUrl += "&pntRef=" + pntFootprintId;
		dialogUrl += selectedParams;
		
		popUp(dialogUrl,dialogWidht,dialogHeight,100,75);
}	

function pntOpenDialogFor(formkey, strUrl, width, height) {
	var detailsForm = document.detailsForm;	
	if (!detailsForm) return alert('no detailsForm');
	var objectId = detailsForm[formkey].value;
	popUp(strUrl,width,height,100,75);
}

//only for setting dialog result on dialogwidget
function pntSetDialogResult(id, formkey, label) {
	pntDialogWidgetSet(id, formkey, label);
}

function pntDialogWidgetSet(id, formkey, label) {
	var labelkey = formkey.replace('Id', ''); //HACK
	var detailsForm = document.detailsForm;	
	if (!detailsForm) return alert('no detailsForm');
	detailsForm[formkey].value = id;
	detailsForm[formkey].title = label; //for easy label retrieval
	detailsForm[labelkey].value = label;
}

//parameter updateMap is optional, array with ids of elements to update by 
//ids of updateElements expected from the server. If the id of an updateElement 
//is not in the updateMap, it will be used directly as the id of the element to be updated.
//for GET make postQuery null, for POST otherwise pass the queryString
function pntAjaxRequest(url, postQuery, updateMap) {
    var httpReq;

    if (window.XMLHttpRequest) { 
        httpReq = new XMLHttpRequest();
        if (httpReq.overrideMimeType) {
            httpReq.overrideMimeType('text/xml');
        }
    } 
    if (!httpReq && window.ActiveXObject) {
        try {	httpReq = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
        	try {	httpReq = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
        }
    }

    if (!httpReq) {
        alert('AJAX error: Can not create XMLHTTP object');
        return false;
    }
    httpReq.onreadystatechange = function() { pntAjaxReadyStateChanged(httpReq, updateMap); };
    if (postQuery) {
    	httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    	httpReq.open('POST', url, true);
    } else {
        httpReq.open('GET', url, true);
    }
    httpReq.send(postQuery);
}

function pntAjaxReadyStateChanged(httpReq, updateMap) {
	var xmldoc;
    try {
        if (httpReq.readyState != 4) {
        	return;
        }
        if (httpReq.status == 200) {
	    	xmldoc = httpReq.responseXML;
	    	if (xmldoc.childNodes.length == 0 || xmldoc.firstChild.nodeName == 'parsererror') {
				alert("AJAX response XML parse error\n\n" + httpReq.responseText);
				return;
			}
        } else {
            alert('AJAX Request Error, Statuscode: ' + httpReq.status);
        }
    } catch( e ) {
        alert('AJAX response error: ' + e.description);
    }
    //alert(httpReq.responseText);
    pntAjaxProcessXml(xmldoc, updateMap);
}

function pntAjaxProcessXml(xmldoc, updateMap) {
	var updates = xmldoc.getElementsByTagName('updateElement');
	for (var i=0; i<updates.length; i++) {
		var update = updates.item(i);
		var idToUpdate = update.getAttribute('id');
		if (updateMap && updateMap[idToUpdate]) 
			idToUpdate = updateMap[idToUpdate];

		pntAjaxUpdateElement(update, idToUpdate);
	}
}

function pntAjaxUpdateElement(update, idToUpdate) {
	var el = document.getElementById(idToUpdate);
	if (el) {
		var dataFound = pntAjaxCopyAttributes(update.attributes, el, 'id');

		//process content CDATA
		var updChilds = update.childNodes;
		for (var j=0; j<updChilds.length; j++) {
			if (updChilds[j].nodeType==4) { //CDATA
				dataFound = true;
				el.innerHTML = updChilds[j].data;
			}
		}
		if (!dataFound) {
			alert("AJAX Error: updateElement without data: '"+ update.getAttribute('id') + "'");
		}
	} else {
		alert("AJAX Error: Element to be updated not found: '" + update.getAttribute('id') + "'");
	}
}

function pntAjaxCopyAttributes(atts, htmlEl, ignore) {
	var dataFound = false;
	for (var j=0; j<atts.length; j++) {
		if (atts[j].nodeName != ignore) {
			dataFound = true;
			if (atts[j].nodeName.substring(0, 6) == 'style.') {
				var statt = atts[j].nodeName.substring(6);
				htmlEl.style[statt] = atts[j].nodeValue;
			} else {
				htmlEl.setAttribute(atts[j].nodeName, atts[j].nodeValue);
			}
		}
	}
	return dataFound;
}
