/**
 * This file contain the generic stuff for helping out with edit activity.
 */

var extraEditParams=null;
/**
 * Gets the params from a edit shema.
 */
function editGetParams(identifier)
{
	var obj=document.getElementById(identifier);
	if (!obj) 
	{
		alert("Internal error: identifier not found");
		return null;
	}
	var elements,i,j;
	var params={};
	if (extraEditParams)
		params=extraEditParams;
	extraEditParams=null;
	var counters={};
	elements=obj.getElementsByTagName("select");
	if (elements)
	{
		for (i=0; i<elements.length; i++) 
		{
			if (elements[i].type == "select-one") 
				params[elements[i].name]=elements[i].options[elements[i].selectedIndex].value;
		}
	}
	var numTags=0, tags=Array();
	tags[numTags++]="input";
	tags[numTags++]="textarea";
	for(j=0;j<numTags;j++)
	{
		elements=obj.getElementsByTagName(tags[j]);
		// If we found any elements we loop thru them
		if (elements)
		{
			if (!params)
				params=Array();
			for (i=0; i<elements.length; i++) 
			{
				temp=null;
				// We make array out of anything we find multiple times except radio buttons.
				if (elements[i].type != "radio")
				{
					if (!counters[elements[i].name]) counters[elements[i].name]=1;
					else
					if (counters[elements[i].name]==1)
					{
						// We found same element more than once.
						if (params[elements[i].name]) params[elements[i].name]=[params[elements[i].name]];
						else params[elements[i].name]=[];
						counters[elements[i].name]++;
					}
				}
				
				// Check to see if value already is given (convert to array)
				if (elements[i].type == "text" || elements[i].type == "hidden" ||
					elements[i].type == "password" || elements[i].type == "textarea" || 
					elements[i].type == "checkbox" && elements[i].checked || 
					elements[i].type == "radio" && elements[i].checked) 
				{
/*					if (params[elements[i].name] && !counters[elements[i].name] && elements[i].type != "radio") 
					{
						params[elements[i].name]=[params[elements[i].name]];
						counters[elements[i].name]=1;
					}
*/					
					if (counters[elements[i].name]>1)
						params[elements[i].name][counters[elements[i].name]++]=elements[i].value;
					else
						params[elements[i].name]=elements[i].value;
				}
//				else 
//					alert(elements[i].type);
			}
		}
	}
	return params;
}

/**
 * Function that does the form submit for a ajax form.
 * 
 * It basicly runes thru every field in the form and collect them before
 * sending them over to the server for action.
 */
function editPostForm(identifier,action,target)
{
	var i,j,numParam=0;
	var params=editGetParams(identifier);
	var obj=document.getElementById(target);
	if (!obj) AjaxPopup(target,action,params);
	else
	if (obj.isPopup) systemAjaxPopup(target,action,params);
	else systemAjaxLink(target,action,params);
}

function editSetFocus(identifier, field,tried)
{
	var obj=document.getElementById(identifier);
	if (!obj) return;
	try
	{
		obj[field].focus();
	} catch (e)
	{
		if (!tried)
			setTimeout("editSetFocus('"+identifier+"','"+field+"',1)",10000);
	}
}

var editOldBodyClick=null;
var editLastShowedMS=null;
var editLastShowedMSElm=null;
// Some stuff for multiselect.
function editToggleMultiSelect(e,elm)
{
	// Cancle bubble:
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
	
	// Get the element:
	if (!elm) return;
	var elmW=elm.offsetWidth;
	var objPH=document.getElementById(elm.id+"_ph");
	var objList=document.getElementById(elm.id+"_list");
	var objTbl=document.getElementById(elm.id+"_tbl");
	if (!objPH || !objList || !objTbl) return;
	// Do the jobb:
	if (objPH.style.display=="block")
		editHideLastMultiSelect();
	else
	{
		var screen=GetScreenSize();
		var scrollAdd=0;
		if (editLastShowedMS)
			editHideLastMultiSelect();
		objPH.style.display="block";
		
		// Now some visual adjustments:
		if (objList.offsetHeight>250)
		{
			objList.style.height="250px";
			// We also like to add the aproximate the size of the scrollbar:
			scrollAdd=17;
		}
		objList.style.width=(objTbl.offsetWidth+scrollAdd)+"px";
		objPH.style.width=(objTbl.offsetWidth+10+scrollAdd)+"px";
		
		if (objPH.offsetWidth<(elmW+scrollAdd))
		{
			objPH.style.width=elmW+"px";
			// Lets adjust the list width:
			objList.style.width=(elmW-10)+"px";
			objTbl.style.width=(elmW-10-scrollAdd)+"px";
		}
		// We need to know wher the "elm" is related to the same parent as "objPH"
		var tmp=elm,xPos=0,yPos=0;
		while (tmp.offsetParent && objPH.offsetParent && tmp.offsetParent!=objPH.offsetParent)
		{
			xPos+=tmp.offsetLeft;
			yPos+=tmp.offsetTop;
			tmp=tmp.offsetParent;
		}
		if (tmp.offsetParent)
		{
			xPos+=tmp.offsetLeft;
			yPos+=tmp.offsetTop;
		}
		// Do we need to put the "dropdown" as a "dropup"?
		var xy2=GetXyCordForObj(elm);
		if (xy2[1]+objPH.offsetHeight+elm.offsetHeight>screen.h)
			objPH.style.top=(yPos-objPH.offsetHeight)+"px";
		else
			objPH.style.top=(yPos+elm.offsetHeight)+"px";
		objPH.style.left=xPos+"px";
		editLastShowedMSElm=elm;
		editLastShowedMS=objPH;
		editOldBodyClick=document.onclick;
		document.onclick=editHideLastMultiSelect;
		objPH.onclick=editCancleMultiSelectBubble;

		// Finaly, set up onclick on the TR
		elements=objTbl.getElementsByTagName("tr");
		var len=elements.length;
		for(var i=0;i<len;i++)
			elements[i].onclick=editToggleMSCheckBox;
	}
	return true;
} 

function editToggleMSCheckBox(e)
{
	if (!e) var e = window.event;
	var target=null;
	if (e.target) target=e.target;
	else
	if (e.srcElement) target=e.srcElement;
	if (!target || target.tagName!="TD") return;
	var elements=this.getElementsByTagName("input");
	if (elements.length==0) return;
	// We only have one element inside each TR.
	elements[0].checked=!elements[0].checked;
}

function editSetAllMSCheckBox(elmID,state)
{
	var objTbl=document.getElementById(elmID+"_tbl");
	if (!objTbl) return;
	var elements=objTbl.getElementsByTagName("input");
	var len=elements.length;
	if (len==0) return;
	for(var i=0;i<len;i++)
		elements[i].checked=state;
}

function editFillOutMultiSelectFields(elm)
{
	if (!elm) return;
	
	var objTbl=document.getElementById(elm.id+"_tbl");
	if (!objTbl) return;
	var elements=objTbl.getElementsByTagName("input");
	var len=elements.length;
	var found=0, oneFound=null;
	if (len==0) return;
	for(var i=0;i<len;i++)
	{
		if (elements[i].checked)
		{
			oneFound=elements[i];
			found++;
		}
	}
	if (found==0) elm.value="";
	if (found==1)
	{
		var label=oneFound.parentNode.getElementsByTagName("label");
		
		elm.value=label[0].innerHTML.replace(/<[^>]*>/g, "");
	}
	if (found>1) elm.value="***";
	
}

function editHideLastMultiSelect()
{
	if (editLastShowedMS)
		editLastShowedMS.style.display="none";
	
	document.onclick=editOldBodyClick;
	// Lets update the "elm" field.
	editFillOutMultiSelectFields(editLastShowedMSElm);
	editLastShowedMS=null;
	editLastShowedMSElm=null;
}

function editCancleMultiSelectBubble(e)
{
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}

// Here is some calender functions.
var activeCalender=null;
var actCalContainer=null;
var actCalInputID="";
var idAdd=0;
var calenderFormats=[];
function ShowEditCalender(id,value,noYear)
{
	var obj=document.getElementById(actCalInputID+"_cont"+idAdd);
	if (obj)
		obj.parentNode.removeChild(obj);
	actCalInputID=id;
//	if (actCalContainer)
//		actCalContainer.parentNode.removeChild(actCalContainer);
	idAdd++;
	actCalContainer=document.createElement("div");
	actCalContainer.className="cpPopup";
	actCalContainer.id=id+"_cont"+idAdd;
	actCalContainer.style.zIndex=currentPopupZIndex+10000;
	document.getElementById("popUpContainer").appendChild(actCalContainer);
	activeCalender=CalendarPopup(id+"_cont"+idAdd);
	activeCalender.showNavigationDropdowns();
	if (noYear)
		activeCalender.setReturnFunction("SetCalenderDateNoYear");
	else
		activeCalender.setReturnFunction("SetCalenderDateYear");
	activeCalender.showCalendar(id+"_anc",value);
}

function SetCalenderDate(y,m,d,index)
{
	var obj=document.getElementById(actCalInputID);
	if (!obj) return;
	if (y==0 || m==0 || d==0)
		obj.value="";
	else
	{
		var value=new Date();
		value.setFullYear(y,m-1,d);
		
		obj.value=phpFormatDate(value,calenderFormats[index]);
	}
}

function SetCalenderDateYear(y,m,d)
{
	SetCalenderDate(y,m,d,0);
}

function SetCalenderDateNoYear(y,m,d)
{
	SetCalenderDate(y,m,d,1);
}

function SetCalenderFormat(index,format)
{
	calenderFormats[index]=format;
}

var fileUploadForms=[];
function FileUploadForm(id)
{
	var obj=document.getElementById(id);
	if (!obj) return;
	editGetParams(id);
	fileUploadForms[id]=obj.action;
	obj.target=id+"_upload";
	obj.action="upload.php";
	obj.onsubmit=null;
}

function DoFileUploadForm(id,params)
{
	if (!fileUploadForms || !fileUploadForms[id]) return;
	extraEditParams=params;
	eval(fileUploadForms[id]);
}

/*
 * Functions for "suggest dropdowns"
 * 
 * THINK! before use!!! Doing LOTS of lookup can be realy heavy 
 * if lots of users does it. For other than "test cases" we need
 * to think if we shall use spessial tables and spessial Ajax calls...
 */

var suggestLastValue="";
var suggestCounter=0;
var suggestLastObj=null;
var suggestSelIndex=0;
var suggestData=null;
var suggestOldSubmit=null;
var suggestBlurClear=false;

function ChangeSuggestData(dir, obj)
{
	if (!suggestData) return;
	var len=suggestData.length, lineObj;
	if (len==0) return;
	suggestSelIndex+=dir;
	if (suggestSelIndex>len) suggestSelIndex=0;
	if (suggestSelIndex<0) suggestSelIndex=len;
	if (suggestSelIndex==0) obj.value=suggestLastValue;
	else obj.value=suggestData[suggestSelIndex-1][1];

	for(var i=0;i<len;i++)
	{
		lineObj=document.getElementById("suggestLine"+i);
		if (suggestSelIndex-1==i) 
		{
			lineObj.style.color="#ffffff";
			lineObj.style.backgroundColor="#000000";
		}
		else
		{
			lineObj.style.color="#000000";
			lineObj.style.backgroundColor="#ffffff";
		}
	}
}

function ChangeSuggestKeyStroke(e,obj)
{
	if (!e) e = window.event;
	var charCode = (e.which) ? e.which : e.keyCode

	if (charCode==38) ChangeSuggestData(-1,obj);
	if (charCode==40) ChangeSuggestData(1,obj);
	if (charCode==13) 
	{
		if (suggestSelIndex>0)
		{
			var objID=document.getElementsByName(obj.name+"ID");
			if (objID) objID[0].value=suggestData[suggestSelIndex-1][0];
			suggestLastValue=obj.value;
			suggestCounter++;
			CustomerSuggest(obj.value,suggestCounter);
		}
		else obj.form.submit();
		return false;
	};
}

function ChangeSuggestKeyUp(e,obj)
{
	if (!e) e = window.event;
	var charCode = (e.which) ? e.which : e.keyCode

	// This are handled elsewhere.
	if (charCode==38 || charCode==40 || charCode==13) return true;
	
	if (suggestLastValue==obj.value) return;
	suggestLastValue=obj.value;
	suggestCounter++;
	suggestLastObj=obj;
	CustomerSuggest(obj.value,suggestCounter);
}

function SetSuggestLine(id, value)
{
	if (!suggestData || !suggestLastObj) return;
	suggestLastObj.value=value;
	var objID=document.getElementsByName(suggestLastObj.name+"ID");
	if (objID) objID[0].value=id;
	suggestLastValue=suggestLastObj.value;
	suggestCounter++;
	CustomerSuggest(value,suggestCounter);
	suggestLastObj.focus();
}

function ClearSuggestDrop(counter)
{
	if (counter!=suggestCounter) return;
	var obj=document.getElementById("SuggestObj");
	if (obj)
	{
		obj.innerHTML="";
		obj.style.display="none";
	}
	suggestData=null;
}

function ClearSuggestDropSubmit()
{
	var obj=document.getElementById("SuggestObj");
	if (obj)
		obj.parentNode.removeChild(obj);
	if (suggestOldSubmit) 
	{
		suggestLastObj.form.submit=suggestOldSubmit;
		suggestLastObj.form.submit();
	}
}

function ClearSuggestDropBlurAfter(counter)
{
	if (counter!=suggestCounter)
		return;
	var obj=document.getElementById("SuggestObj");
	if (obj)
		obj.parentNode.removeChild(obj);
}

function ClearSuggestDropBlur()
{
	setTimeout("ClearSuggestDropBlurAfter("+suggestCounter+");",300);
	if (suggestOldSubmit) 
		suggestLastObj.form.submit=suggestOldSubmit;
}


function SetSuggestDrop(suggestion,counter)
{
	if (!suggestLastObj) return;
	if (counter!=suggestCounter) return;
	var obj=document.getElementById("SuggestObj");
	if (!obj)
	{
		obj=document.createElement("div");
		obj.className="systemSuggest";
		obj.id="SuggestObj";
		obj.style.zIndex=currentPopupZIndex+10000;
		document.getElementById("popUpContainer").appendChild(obj);
		// We also need to capture the submit so we can remove the dropdown...
		suggestOldSubmit=suggestLastObj.form.submit;
		suggestLastObj.form.submit=ClearSuggestDropSubmit;
		var xy=GetXyCordForObj(suggestLastObj);
		obj.style.left=xy[0]+"px";
		obj.style.top=(xy[1]+suggestLastObj.offsetHeight)+"px";
		obj.style.width=suggestLastObj.offsetWidth+"px";
	}
	
	suggestData=suggestion;
	suggestSelIndex=0;
	var len=suggestion.length;
	res="";
	for(var i=0;i<len;i++)
	{
		res+="<div class=\"systemSuggestLine\" id=\"suggestLine"+i+"\" onClick=\"SetSuggestLine("+suggestion[i][0]+",this.innerHTML);\">"+suggestion[i][1]+"</div>";
	}
	obj.style.display="block";
	obj.innerHTML=res;
}

function CheckEditSubmit(obj,e)
{
	if (!e) e = window.event;
	var charCode = (e.which) ? e.which : e.keyCode
	if (charCode==13) 
		obj.form.submit();
}