// JavaScript Document

function preloadImages()
{
  if(document.images)
  {
    if(!document.imageArray) document.imageArray = new Array();
    var i,j = document.imageArray.length, args = preloadImages.arguments;
    for(i=0; i<args.length; i++)
    {
      if (args[i].indexOf("#")!=0)
      {
        document.imageArray[j] = new Image;
        document.imageArray[j++].src = args[i];
      }
    }
  }
}

//--------------------------------------------------------------------------------------------------------------

//DEBUG FUNCTIONS
var g_bDebug = true;
function dprint(sText){
	//DEBUG PRINT
	if (!g_bDebug)		return;
	
	if (!getById('div_debug')){
		//create new
		div = document.createElement('div');
		div.setAttribute('id', 'div_debug');
		//appearance
			div.style.fontFamily = "Verdana";
			div.style.fontSize = "12px";
			div.style.fontWeight = "bold";
			div.style.backgroundColor = "#DDDF99";
			div.style.border = "solid 1px #676921";
			div.style.color = "#9F0000";
			div.style.margin = "5px";
			div.style.padding = "2px";
		div.innerHTML = "<font size='2' color='#0000FF'>DEBUG:</font>";
		document.body.appendChild(div);
	}
	getById('div_debug').innerHTML = getById('div_debug').innerHTML + '<br>' + sText;
}

function dprintObj(obj){
	dprint("Object:");
	var str = '';
	for(prop in obj){
		dprint("\n  - " + prop + " value :"+ obj[prop]);//Concate prop and its value from object
	}
}

function _bool(b){
	return (b)? "true" : "false";
}

//ACCESS FN

//wrapper for document.getElementByid();
function getById(id_element){
	return document.getElementById(id_element);
}


//FORM/CONTAINER  FUNCTIONS ---------------------------------------------------------------------------------------------------------------
var gac_aChildren;
function getAllChildren(obj){
	gac_aChildren = new Array();
	rs_getChildren(obj); 
	return gac_aChildren;
}
function rs_getChildren(obj){
	//recursive function
	//always use var before a counter in 'for loop'
	for(var i=0; i<obj.childNodes.length; i++){
		gac_aChildren.push(obj.childNodes[i])
		rs_getChildren(obj.childNodes[i]);
	}
}

function getObjectFormElements(id_obj){
	obj = getById(id_obj);
	//dprint('Main object: '+obj);
	var aChildren = new Array();
	
	if (obj){
		//valid object
		var aTmp = getAllChildren(obj);
		for(var i=0; i<aTmp.length; i++){
			//keep only form elements
			if (aTmp[i].tagName)
				if (aTmp[i].tagName == 'INPUT' ||aTmp[i].tagName == 'TEXTAREA' ||aTmp[i].tagName == 'SELECT')
					aChildren.push(aTmp[i]);
		}
	}
	
	return aChildren;
}
function getObjectFormElementsByRef(obj){
	//obj is an object
	//dprint('Main object: '+obj);
	var aChildren = new Array();
	
	var aTmp = getAllChildren(obj);
	for(var i=0; i<aTmp.length; i++){
		//keep only form elements
		if (aTmp[i].tagName)
			if (aTmp[i].tagName == 'INPUT' ||aTmp[i].tagName == 'TEXTAREA' ||aTmp[i].tagName == 'SELECT')
				aChildren.push(aTmp[i]);
	}
	
	return aChildren;
}

function getSubmitUrl(id_obj, sUrl){
	//places all children elements from object with id 'id_obj' as _GET values to sUrl
	//alert('fn getSubmitUrl('+id_form+', '+sUrl+')');
	
	//break url
	aTmp = sUrl.split('?');
	firstChar = (aTmp[1])? '&' : '?';
	
	sLink = '';
	var els = getObjectFormElements(id_obj);
	for(i=0; i<els.length; i++){ 
		if (!els[i].name)
			continue;
		if (sLink)
			sLink += '&';
		//dprint('adaug elementul '+els[i]+' cu tagul: '+els[i].tagName);
		sLink += els[i].name + '=' + els[i].value;
	}
	
	sLink = sUrl + firstChar + sLink;

	return sLink;
}

function submitContainer(id_obj, sUrl){
	sLink = getSubmitUrl(id_obj, sUrl);
	window.location = sLink;
}
function submitForm(id_form, sUrl){
	submitContainer(id_form, sUrl);
}

function aplyClassObjectFormElements(obj, inputTextClass, textareaClass, selectClass, bRewrite){
	//dprint('fn aplyClassObjectFormElements');
	var aElements = getObjectFormElementsByRef(obj);
	for(i=0; i<aElements.length; i++){ 
		//test type
		if (aElements[i].tagName == 'INPUT'){
			//dprint('aElements[i].type = '+aElements[i].type)
			if (aElements[i].type == 'text'){
				bAply = (bRewrite)? true : (!aElements[i].className);
				//dprint('             bAply '+_bool(bAply))
				if (bAply)
					aElements[i].className = inputTextClass;
			}
		}
				
		if(aElements[i].tagName == 'TEXTAREA'){
			bAply = (bRewrite)? true : (!aElements[i].className);
			//dprint('             bAply '+_bool(bAply))
			if (bAply)
				aElements[i].className = textareaClass;
		}
			
		if(aElements[i].tagName == 'SELECT'){
			//dprint('aElements[i].className = ['+aElements[i].className+']');
			bAply = (bRewrite)? true : (!aElements[i].className);
			//dprint('             bAply '+_bool(bAply))
			if (bAply)
				aElements[i].className = selectClass;
		}
	}
}

//END FORM/CONTAINER  FUNCTIONS ----------------------------------------------------------------------------------------------------------



//SUPRESS ENTER ---------------------------------------------------------------------------------------
function formElementsSupressEnterKey(id_form){
	//id_form can be now any container (div, td, p, etc...)
	var els = getObjectFormElements(id_form); 
	for(i=0; i<els.length; i++){
		if (els[i].type != 'button' && els[i].type != 'submit')
			supressEnterKey(els[i]);
	}
}
function supressEnterKey(object){
	func = fn_keyPress;
	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 fn_keyPress(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)
			return false;
	}
}
//END SUPRESS ENTER -----------------------------------------------------------------------------------


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 {
		return false;
	}
}



//DISPLAY ---------------------------------------------------------------------------------------------
function hasClass(node, className) {
  if (node.className == className) {
    return true;
  }
  var reg = new RegExp('(^| )'+ className +'($| )')
  if (reg.test(node.className)) {
    return true;
  }
  return false;
}

function changeDisplay(id_element, newDisplay){
	if (getById(id_element))
		getById(id_element).style.display = newDisplay;
}

function changeObjClass(obj, newClass){
	if (obj)
		obj.className = newClass;
}

function getRowDisplayStyle(){
	if (navigator.appName == 'Netscape'){
		//NETSCAPE, FIREFOX si altele
		sShowStyle = "table-row";
	}
	else {
		//IE
		sShowStyle = "inline";
	}
	
	return sShowStyle;
}

function getTableDisplayStyle(){
	return (navigator.appName == 'Netscape')? 'table' : 'inline';
}

function getEventObject(){
	return (navigator.appName == 'Netscape')? e : event;
}

function getCurrentFormElement(){
	//elementul din formular care a declansat evenimentul
	return (navigator.appName == 'Netscape')? e.target : event.srcElement;
}

function getAbsolutePosition(el) {
	//does same thing as getAbsolutePos(el) but without recursion
	var r = { x: 0, y: 0, h: el.offsetHeight, w: el.offsetWidth };
	bool = true;
	while(bool){
		var SL = 0, ST = 0;
		var is_div = /^div$/i.test(el.tagName);//????
		if (is_div && el.scrollLeft)
			SL = el.scrollLeft;
		if (is_div && el.scrollTop)
			ST = el.scrollTop;		
		var tmp = { x: el.offsetLeft - SL, y: el.offsetTop - ST};
		r.x += tmp.x;
		r.y += tmp.y;		
		
		if (el.offsetParent) 
			el = el.offsetParent;//recursivity
		else
			bool = false;
	}
	return r;//left, top & height
};

function ensureObjectVisible(node) {
	var h = self.innerHeight || document.documentElement.clientHeight || document.body.clientHeight || 0;
	var offset = self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
	var pos = getAbsolutePosition(node);
	if (pos.y + node.scrollHeight > h + offset) {
		if (node.scrollHeight > h) {
			window.scrollTo(0, pos.y);
		} else {
			window.scrollTo(0, pos.y + node.scrollHeight - h);
		}
	}
}

function ensureRowVisibleInDiv(obj_row, obj_div, direction) {
	var pos = getAbsolutePosition(obj_row);
	var pos_div = getAbsolutePosition(obj_div);
	var h = pos_div.h;
	var row_top = pos.y - pos_div.y;
	//dprint('obj_div.id = '+obj_div.id+'| row_top = '+row_top+' | obj_div.scrollTop ='+obj_div.scrollTop);
	/*if (direction > 0){
		//moving down
		if (row_top - obj_div.scrollTop + obj_row.scrollHeight > h) {
			obj_div.scrollTop += direction * obj_row.scrollHeight;
		}
	}
	else {
		//moving up
		if (row_top < obj_div.scrollTop) {
			obj_div.scrollTop += direction * obj_row.scrollHeight;
		}
	}*/
	if (row_top < obj_div.scrollTop)
		obj_div.scrollTop = row_top;
	else
		if (row_top + obj_row.scrollHeight > obj_div.scrollTop + h )
			obj_div.scrollTop = row_top + obj_row.scrollHeight - h;
}


//END DISPLAY ----------------------------------------------------------------------------------------



function isAlpha (sir) {
	//functia verifica dk sir are doar caractere permise:

	caracterePermise = "abcdefghijklmnopqrstuvwxyz";
	sirTest = sir.toLowerCase();
    rez = 0;
    for (var i=0; i<sirTest.length; i++) {
    	x = caracterePermise.indexOf(sirTest.charAt(i));
    	if (x == -1) {
    		return false;//am un caracter din afara multimii mele
    	}
    }
	return true;
}

function isNumeric (sir) {
	//functia verifica dk sir are doar numere:

	caracterePermise = "0123456789";
    rez = 0;
    for (var i=0; i<sir.length; i++) {
    	x = caracterePermise.indexOf(sir.charAt(i));
    	if (x == -1) {
    		return false;//am un caracter din afara multimii mele
    	}
    }
	return true;
}

function str_pad(sText, chrPad, length) {
    var str = '' + sText;
    while (str.length < length)
        str = chrPad + str;
    return str;
}

//Date functions ------------------------------------------------------------------
function getYear(d) {
	return (d < 1000) ? d + 1900 : d;
}
function isDate (year, month, day) {
	//alert(year+', '+month+', '+day);
	// month argument must be in the range 0 - 11
	var tempDate = new Date(year, month, day);
	//alert('year: '+getYear(tempDate.getYear())+' = '+year);
	//alert('month: '+getYear(tempDate.getMonth())+' = '+month);
	//alert('day: '+getYear(tempDate.getDate())+' = '+day);
	if ( (getYear(tempDate.getYear()) == year) &&
	    (month == tempDate.getMonth()) &&
	    (day == tempDate.getDate()) )
		return true;
	else
		return true;
}

function dateConvert(mysqlDate){
	//convert a mysql date into js date
	var aTmp = mysqlDate.split('-');
	var d = new Date();
		d.setFullYear(parseInt(aTmp[0], 10));
		d.setMonth(parseInt(aTmp[1], 10)-1);
		d.setDate(parseInt(aTmp[2], 10));
		d.setHours(0, 0, 0, 0);
	return d;
}

function dateRevert(d){
	//convert a js date into mysql date
	var sDate = '';
	sDate += d.getFullYear();
	sDate += '-';
	sDate += str_pad(d.getMonth() + 1, '0', 2);
	sDate += '-';
	sDate += str_pad(d.getDate(), '0', 2);
	return sDate;
}

function dateIncrement(obDate, days){
	//increment date by one day
	if (!days) days = 1;
	var d = obDate;
	d.setDate(d.getDate() + days);
	return d;
}

function dateDiff(d1, d2){
	//d1 - d2
	var one_day = 1000 * 60 * 60 * 24;

	//Calculate difference btween two dates, and convert to days
	return Math.ceil( (d1.getTime() - d2.getTime()) / (one_day) );
}

function dateBetween(d, d1, d2){
	//checks if d is between d1 and d2
	t0 = d.getTime();
	t1 = d1.getTime();
	t2 = d2.getTime();
	if (t1 > t2){
		//swap
		tmp = t1
		t1 = t2;		
		t2 = tmp
	}
	b = (t0 >= t1 && t0 <= t2);
	//if (dateRevert(d) == dateRevert(d2)) dprint('Bool:'+b+' = dateBetween('+dateRevert(d)+'|'+t0+',  '+dateRevert(d1)+'|'+t1+',  '+dateRevert(d2)+'|'+t2+')');
	
	return b;
}

function dateMin(d1, d2){
	t1 = d1.getTime();
	t2 = d2.getTime();
	return (t1 < t2)? d1 : d2;
}

function dateMax(d1, d2){
	t1 = d1.getTime();
	t2 = d2.getTime();
	return (t1 > t2)? d1 : d2;
}

function cloneDate(d) {
    newDate = new Date();
	newDate.setFullYear(d.getFullYear());
	newDate.setMonth(d.getMonth());
	newDate.setDate(d.getDate());
	newDate.setHours(d.getHours());
	newDate.setMinutes(d.getMinutes());
	newDate.setSeconds(d.getSeconds());
	newDate.setMilliseconds(d.getMilliseconds());

	return newDate;
}
// End Date functions -----------------------------------------------------------------


function verifyFieldInterval(idField, val1, val2, msg){
	//tests if a number belongs to interval [val1, val2]
    ctrl = document.getElementById(idField);
	if (!isNumeric(ctrl.value)){
    	alert( msg);
    	ctrl.focus();
    	return false;
    }
		
    if (ctrl.value < val1 || ctrl.value > val2){
    	alert( msg);
    	ctrl.focus();
    	return false;
    }
    return true;
}

function verifyFieldNotEmpty(idField, msg){
	//tests if a field is not empty returns false if empty
	//if (0) alert('idfield = '+idField+', object: '+document.getElementById(idField));
    ctrl = document.getElementById(idField);
    if (ctrl.value == ''){
    	alert( msg);
    	ctrl.focus();
    	return false;
    }
    return true;
}

function verifyFieldNotZero(idField, msg){
	//tests if a field is not zero returns false if zero
    ctrl = document.getElementById(idField);
	fFloat = parseFloat(ctrl.value);
    if (ctrl.value == 0){
    	alert( msg);
    	ctrl.focus();
    	return false;
    }
    return true;
}


function verifyFieldTypeLength(idField, type, iLength, msg){
	//type = {'numeric', 'alpha'}
    ctrl = document.getElementById(idField);
	
	if (type == 'numeric'){
		bOk = isNumeric(ctrl.value);
	}
	else{//alpha
		bOk = isAlpha(ctrl.value);
	}
	sValue = '' + ctrl.value;
	bOk &= sValue.length == iLength;
	
    if (!bOk){
    	alert( msg);
    	ctrl.focus();
    	return false;
    }
    return true;
}

function verifyFieldNumber(idField, msg){
	//tests if a number belongs to interval [val1, val2]
    ctrl = document.getElementById(idField);
	fFloat = parseFloat(ctrl.value);
    if (isNaN(fFloat)){
    	alert( msg);
    	ctrl.focus();
    	return false;
    }
    return true;
}

function veryfyAllowedChars (sir, caracterePermise) {
	//functia verifica dk sir are doar numere:

	//caracterePermise = "0123456789";
    rez = 0;
    for (var i=0; i<sir.length; i++) {
    	x = caracterePermise.indexOf(sir.charAt(i));
    	if (x == -1) {
    		return false;//am un caracter din afara multimii mele
    	}
    }
	return true;
}

function veryfyNotAllowedChars (sir, caractereNepermise) {
	//functia verifica dk sir are vreun caracter nepermis:
	//intoarce 0 dk nu am caracter nepermis, si indexul primului caracter nepermis, indexul incepe de la 1

	//caractereNepermise = "{}[]()\".,'\\+-/*=!@#$%^&";
    rez = 0;
    for (i=0; i<sir.length; i++) {
    	//caut in caractereNepermise fiecare caracter din sir
    	x = caractereNepermise.indexOf(sir.charAt(i));
    	if (x != -1) {
    		rez = i+1;
    		break;
    	}
    }
	return rez;
}

function verifyValidInput(id_input, sMsg){
	//functia verifica anumite caractere nepermise 
	//caracterele ' (apostrof) si - (minus) le las totusi
	if (!getById(id_input))
		return false;
		
	sir = getById(id_input).value;
	caractereNepermise = "`~!@#$%^&*()_+=|\\{}[];:\".,<>/?";//- {', -}
	b = veryfyNotAllowedChars(sir, caractereNepermise);
	if (b > 0){
		sMsg = (sMsg)? sMsg : 'Atentie aveti un caracter nepermis!';
		alert(sMsg);
		getById(id_input).focus();
		return false;
	}
	return true;
}


function verifyEmail(idField, msg){
	//tests if a number belongs to interval [val1, val2]
    ctrl = document.getElementById(idField);
    if (! validateEmail(ctrl.value)){
    	alert( msg);
    	ctrl.focus();
    	return false;
    }
    return true;
}

function promptUser(sMsg){
	return confirm(sMsg);
}


function lostFocusNumericBox(ctrl){
	//inlocuieste ',' cu '.' pentru casete numerice
	var rExp = /,/;
	ctrl.value = ctrl.value.replace(rExp, '.');
	if (isNaN(parseFloat(ctrl.value)))
		ctrl.value = '0';
}
function _lostFocusNumericBox(e){
	//asta este pentru elemente creeate dinamic
	//inlocuieste ',' cu '.' pentru casete numerice
    var ctrl = (navigator.appName == 'Netscape')? e.target : event.srcElement;
	var rExp = /,/;
	ctrl.value = ctrl.value.replace(rExp, '.');
	if (isNaN(parseFloat(ctrl.value)))
		ctrl.value = '0';
}

function promptLinkUser(sMessage, sLink){
	var x = confirm(sMessage);
	if (x) {
	   	window.location = sLink;
	}
}

function enableButton(id_button, bEnable, sClass1, sClass2){
	ctrl = document.getElementById(id_button);
	ctrl.disabled = !bEnable;
	ctrl.className = (bEnable)? sClass1 : sClass2;
}

function myRound(number, nZecimale){
	number = parseFloat(number);//acept si numar de tip String
	var sNumber = "" + number.toFixed(nZecimale);
	var rez = parseFloat(sNumber);
	return rez;
}

if (!ROL)
	var ROL = 1;
if (!EUR)
	var EUR = 2;
if (!USD)
	var USD = 3;
if (!RON)
	var RON = 4;

function ff_convert_ex(pret, moneda1, moneda2, feuro, fdolar, proc_curs) {//NOTA: se aplica rotunjire!
	if (!moneda1 || !moneda2 || moneda1 == moneda2)
		return pret;

	//alert('convert_ex -> euro: '+euro1+', dolar: '+dolar1+', proc_curs: '+proc_curs);
	//fac in RON
	if (moneda1 == EUR)
		pret_lei = pret * feuro;
	else if (moneda1 == USD)
		pret_lei = pret * fdolar;
	else if (moneda1 == ROL)
		pret_lei = pret / 10000;
	else//RON
		pret_lei = pret;
    
	//am calculat in RON si aplic proc_curs daca monedele difera si daca prima mon nu e RON
    if (moneda1 != moneda2 && moneda1 != RON)
		pret_lei *= (1 + proc_curs);


	//acum fac in moneda respectiva
	if (moneda2 == EUR)

		pret_moneda2 = pret_lei / feuro;
	else if (moneda2 == USD)
		pret_moneda2 = pret_lei / fdolar;
	else if (moneda2 == ROL)
		pret_moneda2 = pret_lei * 10000;
	else//RON
		pret_moneda2 = pret_lei;

	//alert('test :'+pret_moneda2+' = convert '+pret+' from '+moneda1+' to '+moneda2+' using EUR= '+euro1+', USD = '+dolar+', extra% '+proc_curs);
	return myRound(pret_moneda2, 2);
}

function validateEmail(sEmail) {
 //Validating the email field
  var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  return sEmail.match(re);
}

function str_replace(sWhat, sReplace, sWhere){
	var rExp = new RegExp(sWhat, "g");//scot spatiile
	sResult = sWhere.replace(rExp, sReplace);
	return sResult;
}

function str_search(sWhat, sWhere){
	var rExp = new RegExp(sWhat, "g");//scot spatiile
	sResult = sWhere.search(rExp);
	return sResult;
}

/**
 * Returns true if 's' is contained in the array 'a'
 * @author Johan Känngård, http://dev.kanngard.net
 */
function array_contains(a, e) {
	for(j=0;j<a.length;j++)
		if(a[j]==e)
			return true;
	return false;
}

function array_search(a, e) {
	for(j=0;j<a.length;j++)
		if(a[j]==e)
			return j;
	return -1;
}

/**
 * Removes duplicates in the array 'a'
 * @author Johan Känngård, http://dev.kanngard.net
 */
function array_unique(a) {
	tmp = new Array(0);
	for(i=0;i<a.length;i++){
		if(!array_contains(tmp, a[i])){
			tmp.length+=1;
			tmp[tmp.length-1]=a[i];
		}
	}
	return tmp;
}

