//functions for manipulating divs

//set function for outside click
document.onclick = closeAllDivs;

var currentDivId  = '';

cDiv = function (a, b, c) { //defining object cDiv
	this.id = a;
	this.is_oppened = b;
	this.id_info = c;
}

var aDivs = new Array();// of type cDiv
var iDivs = -1;
function searchDiv(id_div){
	for (i=0; i<=iDivs; i++){
		//dprint('fn searchDiv test ['+aDivs[i].id+'] == ['+id_div+']');
		if (aDivs[i].id == id_div)
			return i;
	}
	return -1;
}
function ds_isDivOppened(id_div){
	k = searchDiv(id_div);
	//dprint('fn ds_isDivOppened('+id_div+') k = '+k);
	return (k != -1)? aDivs[k].is_oppened : false;
}

function getStyleObject(objectId) {
	// cross-browser function to get an object's style object given its
	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 moveDiv(id_div, new_x, new_y){
	var the_style = getStyleObject(id_div);
	var the_left = parseInt(new_x);
	var the_top = parseInt(new_y);
	if (document.layers) {
		the_style.left = the_left;
		the_style.top = the_top;
	}
	else {
		the_style.left = the_left + "px";
		the_style.top = the_top + "px";  
	}
}

function ds_init(id_div){
	//dprint('fn: ds_init('+id_div+')');
	//atach keyPress event 
	var id_text = 'txt_' + id_div;
	addEvent(getById(id_text), 'keydown', ds_captureKeyDown);
	addEvent(getById(id_text), 'keyup', ds_captureKeyUp);
	
	//supress enter key ----------------------------------------
	object = getById(id_text);
	func = ds_captureKeyPress;
	var oldFunction = object.onkeypress;
	if (typeof object.onkeypress != 'function') {
		object.onkeypress = func;
	}
	else {
		object.onkeypress = function() {
			oldFunction();
			func();//first the new one and then the old one
		}
	}
}

function closeAllDivs(){
	//alert('close all');
	for (i=0; i<=iDivs; i++){
		//alert('i = '+i+', is-oppened = '+aDivs[i].is_oppened);
		if (aDivs[i].is_oppened)
			showDiv(aDivs[i].id, false, '');
	}
	currentDivId  = '';
}

function showDiv(id_div, bShow, id_info){
	//getById(id_div).style.display = (bShow)? 'block' : 'none';
	bDivOppenedKey = true;
	k = searchDiv(id_div);
	//alert('k = '+ k);
	if (bShow){
		if (k == -1){
			//adaug divul in vector
			//alert('Adaug divul');
			iDivs ++;
			aDivs[iDivs] = new cDiv(id_div, false, id_info);
			k = iDivs;
		}
		aDivs[k].is_oppened = true;
		getById(aDivs[k].id).style.display = 'block';
		getById('ifrm_'+aDivs[k].id).style.display = 'block';
		getById(id_info).innerHTML = defaultDivInfo;//ajax loading image
		//ensure visible
		ensureObjectVisible(getById(id_div));
	}
	else{
		//ascund divul
		//alert('ascund divul ['+id_div+']');
		if (k != -1){
			aDivs[k].is_oppened = false;
			getById(aDivs[k].id).style.display = 'none';
			getById('ifrm_'+aDivs[k].id).style.display = 'none';
			getById(aDivs[k].id_info).innerHTML = defaultDivInfo;//ajax loading image
			if (aDivs[k].id == currentDivId)
				currentDivId = '';
		}
		//dk nu exista nu ascund nimic
	}
}

var bDoubleClick = false;
function showDivSelectDblclk(id, sTarget){
	bDoubleClick = true;
	showDivSelect(id, sTarget);
}

var called = 0;
var lastCallAt = new Date().getTime();//time of last call of showDivSelect in miliseconds
var waitFor = 100;//ms | wait for x ms after the keypress event, before calling ajax | doesn't always work :|

function showDivSelect(id, sTarget){
	//this function is ussualy called on a keyUp event, so i'll ignore some keys
	
	newCallAt = new Date().getTime();
	diff = newCallAt - lastCallAt;
	//alert(newCallAt+' - '+lastCallAt+' ('+diff+') >= '+waitFor);
	if (diff >= waitFor)
		_showDivSelect(id, sTarget);
	lastCallAt = newCallAt;
}

function _showDivSelect(id, sTarget){
	var id_text 		= 'txt_' + id;
	var id_div 			= 'div_' + id;
	var id_frame 		= 'ifrm_' + id;
	var id_target 		= 'target_' + id;
	var id_info 		= 'div_info_' + id;
	var id_aj_params 	= 'aj_qString_' + id;
	var id_trigch		= 'trigch_' + id;
	var id_parents 		= 'parents_' + id;
	
	ds_closeCustomPage(id, 'close', 'close');
	last_row_index = -1;//highlited row
	
	//alert('text length = '+getById(id_text).value.length);
	triggerChars = parseInt(getById(id_trigch).value, 10);
	//dprint('triggerChars = '+triggerChars);
	if (getById(id_text).value.length < triggerChars) {
		closeAllDivs();
		if (getById(id_text).value.length == 0)
			ds_reset(id);
		return;
	}
	
	currentDivId = id;//current oppened div
	
	if (!bDoubleClick)
		divResetValue();//must reset
	bDoubleClick = false;
	
	r = getAbsolutePosition(getById(id_text));
	//alert('r.x = '+r.x+' | r.y = '+r.y);
	moveDiv(id_div, r.x, r.y + r.h + 1);
	moveDiv('ifrm_'+id_div, r.x, r.y + r.h + 1);
	
	showDiv(id_div, true, id_info);//+ iframe

	//show loading image
	if (getById('div_info_'+currentDivId))
		getById('div_info_'+currentDivId).innerHTML = defaultDivInfo;


	//check parent filters
	var aParents= getById(id_parents).value.split(',');
	//dprint('aParents = '+aParents);
	sParentValues = ''
	if (aParents[0]){
		for (var i=0; i<aParents.length; i++){
			if(sParentValues) sParentValues += '|';
			sParentValues += getById(aParents[i]).value;
		}
	}
	sExtraCondition = (sParentValues)? "&parents_values="+sParentValues : "";
	//dprint('sExtraCondition = ['+sExtraCondition+']');
	
	//load url through ajax
	sFile = sTarget;
	qString = SID + '&' + getById(id_aj_params).value + getById(id_text).value + sExtraCondition;
	//dprint('ajax divSelect: '+sFile+'?'+qString);
	called ++;
	//ajax_openFile(sFile, qString, loadDataIntoDiv);
	buffReceived = ajax_openFileSyncPost(sFile, qString);
	loadDataIntoDiv(buffReceived);
}

var currentDivId  = '';
function loadDataIntoDiv(buffer){
	//alert('called '+called+' times');
	//dprint('buf primit: \n'+buffer);
	if (getById('div_info_'+currentDivId))
		getById('div_info_'+currentDivId).innerHTML = buffer;
}

function divSelectRow(idValue, textValue){
	//alert('fn. divSelectRow | currentDivId: '+currentDivId+', idValue = '+idValue+', textValue = '+textValue);
	if (!idValue || idValue == '...'){
		alert('Selectati alta optiune!');
		return;
	}
		
	if (getById(currentDivId)){
		//alert('Setting now');
		getById(currentDivId).value = idValue;
		getById('txt_'+currentDivId).value = textValue;
	}
	//else
	//	alert('Not set!');
	
	//close current div
	showDiv('div_'+currentDivId, false, '');
	
	//hide tooltip
	tt_Hide();
	
	//emphasis main form element
	dsEmphasis(currentDivId);
	
	//check for callback function	
	fnCallback = getById('callback_'+currentDivId).value;
	if (fnCallback){
		//dprint("Must call fnCallback : "+fnCallback+"('"+currentDivId+"', '"+idValue+"', '"+textValue+"')");
		sEval = fnCallback+"('"+currentDivId+"', '"+idValue+"', '"+textValue+"')";
		eval(sEval);
	}
}

var KEY_UP = 38;
var KEY_DOWN = 40;
var KEY_ENTER = 13;
var KEY_ESCAPE = 27;

function ds_captureKeyDown(e){
	//get event
	var objEvent = (navigator.appName == 'Netscape')? e : window.event;
	//dprint('ds_captureKeys - objEvent = '+objEvent+' | e = '+e+' | window.event = '+window.event);
	
	if (objEvent){
		//get object
		var obj = (navigator.appName == 'Netscape')? e.target : event.srcElement;
		var id_div = str_replace("txt_", "", obj.id); 
		var sTarget = getById("target_"+id_div).value;
		//dprint('event obj: '+obj+' | id_div = '+id_div+' | sTarget = '+sTarget);
	
		//key code
		key = objEvent.keyCode ? objEvent.keyCode : objEvent.which;
		//dprint('ds_captureKeys: key pressed | key : '+key);
		
		if (key >= 45 || key == 8){//8 == backspace
			//normal keys, do nothing
			//dprint('ds_captureKeyDown: normal key');
		}
		else{
			//dprint('ds_captureKeyDown: special key');
			// i need UP, DOWN, ENTER and ESCAPE
			switch(key){
				case KEY_UP:
					//dprint('KEY_UP');
					if (!ds_isDivOppened('div_'+id_div))
						showDivSelect(id_div, sTarget);
					//highlight row
					ds_moveRow(id_div, -1);
					break;
					
				case KEY_DOWN:
					//dprint('KEY_DOWN');
					if (!ds_isDivOppened('div_'+id_div))
						showDivSelect(id_div, sTarget);
					//highlight row
					ds_moveRow(id_div, +1);
					break;
					
				case KEY_ENTER:
					//dprint('KEY_ENTER');
					if (ds_isDivOppened('div_'+id_div)){
						//select row
						ds_selectLastRow();
					}
					break;
					
				case KEY_ESCAPE:
					//dprint('KEY_ESCAPE');
					if (ds_isDivOppened('div_'+id_div)){
						//close div
						showDiv('div_'+id_div, false, '');
					}
					break;
					
			}//switch key
			
		}//special keys
		
	}//if (objEvent)
}

function ds_captureKeyUp(e){
	//get event
	var objEvent = (navigator.appName == 'Netscape')? e : window.event;
	//dprint('ds_captureKeys - objEvent = '+objEvent+' | e = '+e+' | window.event = '+window.event);
	
	if (objEvent){
		//get object
		var obj = (navigator.appName == 'Netscape')? e.target : event.srcElement;
		var id_div = str_replace("txt_", "", obj.id); 
		var sTarget = getById("target_"+id_div).value;
		//dprint('event obj: '+obj+' | id_div = '+id_div+' | sTarget = '+sTarget);
		
		//key code
		key = objEvent.keyCode ? objEvent.keyCode : objEvent.which;
		//dprint('ds_captureKeys: key pressed | key : '+key);
		
		if (key >= 45 || key == 8){
			//normal keys
			//dprint('ds_captureKeyUp: normal key');
			showDivSelect(id_div, sTarget);
		}
		else{
			//special key, do nothing
			//dprint('ds_captureKeyUp: special key');
		}//special keys
	}//if (objEvent)
}

var bDivOppenedKey = false;//true la deschidere, false la enter
function ds_captureKeyPress(e){
	objEvent = (navigator.appName == 'Netscape')? e : window.event;
	if (objEvent){
		key = objEvent.keyCode ? objEvent.keyCode : objEvent.which;
		//alert('key pressed | key : '+key);
		if (key == 10 | key == 13){
			if (bDivOppenedKey)
				return bDivOppenedKey = false;
		}
	}
}

function divResetValue(){
	if (getById(currentDivId)){
		//alert('Setting now');
		getById(currentDivId).value = 0;
	}
	
	//unemphasis main form element
	dsUnEmphasis(currentDivId);
}

function dsEmphasis(div_id){
	//emphasis element
	getById('txt_' + div_id).style.borderWidth = '2px';
}
function dsUnEmphasis(div_id){
	//remove emphasis of element
	getById('txt_' + div_id).style.borderWidth = '1px';//revert to normal
}


var last_row_index = -1;
var last_row_value = '';
var last_row_text = '';
function ds_highLiteRow(id_div, index_row){
	//first unhighlite last one
	var id_row = '';
	if (last_row_index != -1){
		id_row = id_div + '_tr_' + last_row_index;
		//dprint('ds_highLiteRow: last_row_index '+last_row_index+id_row+' | getById(id_row) = '+getById(id_row));
		changeRowBgColor(getById(id_row), aBgColor[0]);
	}
	//highlite current	
	id_row = id_div + '_tr_' + index_row;
	//dprint('ds_highLiteRow: row '+id_row+' | getById(id_row) = '+getById(id_row)+' | tag = ['+getById(id_row).className+']');
	if (getById(id_row)){
		direction = (index_row > last_row_index)? +1 : -1;
		ensureRowVisibleInDiv(getById(id_row), getById('div_info_'+id_div), direction);		
		changeRowBgColor(getById(id_row), aBgColor[1]);
		//set new active row
		last_row_index = index_row;
		aTmp = getById(id_row).className.split("|");
		last_row_value = aTmp[0];
		last_row_text = aTmp[1];
	}
}

function ds_moveRow(id_div, step){	
	var index_row = last_row_index + step;
	if (index_row < 0)	index_row = 0;
	var id_row = id_div + '_tr_' + index_row;
	//dprint('ds_moveRow: to '+id_row+' | getById(id_row) = '+getById(id_row));
	if (getById(id_row)){
		ds_highLiteRow(id_div, index_row)
	}
}

function ds_selectLastRow(){
	if (last_row_index != -1){
		//dprint('ds_selectLastRow : ['+last_row_value+'] & ['+last_row_text+']');
		divSelectRow(last_row_value, last_row_text);
		//reset vars
		last_row_index = -1;
		last_row_value = '';
		last_row_text = '';
	}
}

var aBgColor = new Array('#EEF1F2', '#A6B6BB')
function changeRowBgColor(rowElement, color){
	rowElement.style.backgroundColor = color;
}

function ds_getText(id_ds){
	return  getById('txt_'+id_ds).value;
}



// TOOL TIP functions --------------------------------------------------------------------------------------
//using 'wz_tooltip.js' as main file

var current_TT_object = '';
var tooltip_delay = 0;	//ms
var lastHoverAt = new Date().getTime();
var tooltip_last_buffer = '';
function hoverRow(rowElement, fileName, fieldName, fieldValue){
	if (!fieldValue || fieldValue == '...')
		return;
		
	currentHoverAt = new Date().getTime();
	if (currentHoverAt - lastHoverAt >= tooltip_delay){
		//call tooltip using ajax
		if (rowElement != current_TT_object){
			current_TT_object = rowElement;
			sFile = g_server_path + 'js_php/' + fileName;
			qString = fieldName+'='+fieldValue;
			ajax_openFile(sFile, qString, receiveTip);
			lastHoverAt = currentHoverAt;
		}
		else{
			//use last buffer
			receiveTip(tooltip_last_buffer);
		}
	}
}

function receiveTip(buffer){
	tooltip_last_buffer = buffer;
	if (current_TT_object){
		//dprint('call of Tip(), buffer = \n'+buffer);
		//dprint('current_TT_object: '+current_TT_object);
		Tip(tooltip_last_buffer, DELAY, 0, FOLLOWMOUSE, false, FIX, CalcFixXY(current_TT_object), BGCOLOR, '', BORDERWIDTH, 0);
	}
	//current_TT_object = '';
}

function CalcFixXY(domObject){
	r = getAbsolutePosition(domObject);//form_functions.js
	//alert(r.x+', '+r.y+', '+r.h+', '+r.w);
	a = new Array(r.x + 1 * r.w + 1, r.y + r.h*0);
	//alert(a);
	return a;
}


// custom page oppening --------------------------------------------------------------------------------------
function ds_openCustomPage(id, fnCallback){
	closeAllDivs();
	
	var id_text = 'txt_' + id;
	var id_div 	= 'cpdiv_' + id;
	var id_frame= 'ifrm_cpdiv_' + id;
	//alert('opening '+id_div);
	
	r = getAbsolutePosition(getById(id_text));
	//alert('r.x = '+r.x+' | r.y = '+r.y);
	moveDiv(id_div, r.x, r.y + r.h + 1);
	moveDiv(id_frame, r.x, r.y + r.h + 1);
	
	//switch display
	pStyle = getById(id_div).style;//referinta
	pStyle.display = (pStyle.display == 'none')? 'block' : 'none';
	//IE frame
	pStyleFrm = getById(id_frame).style;//referinta
	pStyleFrm.display = (pStyleFrm.display == 'none')? 'block' : 'none';
	

	if (pStyle.display != 'none'){
		eval(fnCallback+"()");//call user function with no arguments
	}
	
	return true;
}

function ds_closeCustomPage(id, idValue, textValue){
	var id_div = 'cpdiv_' + id;
	var id_frame = 'ifrm_cpdiv_' + id;
	if (!getById(id_div))		return;
	//alert('closing '+id_div);
	
	if (idValue != 'close'){
		//setting values
		//alert("fn ds_closeCustomPage will set values!")
		currentDivId = id;
		divSelectRow(idValue, textValue);
	}
	
	//hide div + iframe
	getById(id_div).style.display = 'none';
	getById(id_frame).style.display = 'none';
	
	closeAllDivs();//must clean variables
	
	return true;
}

function ds_reset(div_id){
	getById(div_id).value = 0;
	getById('txt_'+div_id).value = '';
	dsUnEmphasis(div_id);
}
