
// ------------------------------------------------------------------------
// DHTML Suite Functions
// ------------------------------------------------------------------------		

var calendarObjForForm = new DHTMLSuite.calendar({minuteDropDownInterval:10,numberOfRowsInHourDropDown:5,callbackFunctionOnDayClick:'getDateFromCalendar',isDragable:true,displayTimeBar:true}); 

// ------------------------------------------------------------------------		
function pickDate(buttonObj, inputObject) {
    
    inputFormat='yyyy-mm-dd';

    var myCalendarModel = new DHTMLSuite.calendarModel({ initialYear:2010,initialMonth:03,initialDay:15 });
	myCalendarModel.setLanguageCode('fr');
	calendarObjForForm.setCalendarModelReference(myCalendarModel);
	
	calendarObjForForm.setCalendarPositionByHTMLElement(inputObject,0,inputObject.offsetHeight+2);	// Position the calendar right below the form input
	calendarObjForForm.setInitialDateFromInput(inputObject, inputFormat);	// Specify that the calendar should set it's initial date from the value of the input field.
	calendarObjForForm.addHtmlElementReference('myDate',inputObject);	// Adding a reference to this element so that I can pick it up in the getDateFromCalendar below(myInput is a unique key)
	calendarObjForForm.displayTimeBar=false;
	if(calendarObjForForm.isVisible()){
		calendarObjForForm.hide();
	}else{
		calendarObjForForm.resetViewDisplayedMonth();	// This line resets the view back to the inital display, i.e. it displays the inital month and not the month it displayed the last time it was open.
		calendarObjForForm.display();
	}		
}	
/* inputArray is an associative array with the properties
year
month
day
hour
minute
calendarRef - Reference to the DHTMLSuite.calendar object.
*/

// ------------------------------------------------------------------------		
function getDateFromCalendar(inputArray)
{
	var references = calendarObjForForm.getHtmlElementReferences(); // Get back reference to form field.
    references.myDate.value = inputArray.year + '-' + inputArray.month + '-' + inputArray.day;	calendarObjForForm.hide();	
	
}	

// ------------------------------------------------------------------------		
function autoFillValidate(id) {

	var key_id=String(id).replace(/_display/i,'');
	
	// Clear hidden key/selected field if displayed field is cleared
	if (document.getElementById(id).value=='') {
	    if(document.getElementById(key_id)) document.getElementById(key_id).value='';
	    if(document.getElementById(key_id+'_selected')) document.getElementById(key_id+'_selected').value='';
	}
	
	// Ensure that displayed field contains always the selected value (the user could clear part of it or enter an invalid value)
	else if (document.getElementById(key_id+'_selected')) {	
		if (document.getElementById(id).value!=document.getElementById(key_id+'_selected').value) {
		    document.getElementById(id).value=document.getElementById(key_id+'_selected').value;
		}
	}
}

// ------------------------------------------------------------------------
// APP Functions
// ------------------------------------------------------------------------		

//---------------------------------------------------------------------------
function app_popup_show(modal) {
	dom_show('app-popup');		
	if (modal) dom_show('app-click-catcher');		
}

//---------------------------------------------------------------------------
function app_popup_hide() {
	dom_hide('app-popup');		
	dom_hide('app-click-catcher');		
}

//---------------------------------------------------------------------------
function app_popup_show_url(url, easyClose, modal) {
	dom_load_url('app-popup-content', url);		
	app_popup_show(modal);		
	if (easyClose) {
		document.getElementById('app-popup').onClick=app_popup_hide; 
	} else {
		document.getElementById('app-popup').onClick=false; 
	} 
}

//---------------------------------------------------------------------------
function app_popup_set_title(title) {
	dom_set_html('app-popup-title', title);
}

//---------------------------------------------------------------------------
function app_notify(html, autoHide, className) {
	app_dialog_show();
    document.getElementById('app-dialog').className=className;
	document.getElementById('app-dialog').onClick=app_dialog_hide; 
	if (autoHide) {
	   setTimeout("app_dialog_hide()", 2000); 
	} else {
	   html=html+'<input type="button" value="OK" onClick="app_dialog_hide();">';
	}
	dom_set_html('app-dialog', html);
}

//---------------------------------------------------------------------------
function app_dialog_show_url(url, modal) {
    document.getElementById('app-dialog').onClick=false; 
	dom_load_url('app-dialog', url);		
	dom_show('app-dialog');		
	if (modal) dom_show('app-click-catcher');		
}

//---------------------------------------------------------------------------
function app_dialog_show(html, modal) {
    document.getElementById('app-dialog').onClick=false; 
 	if (html) dom_set_html('app-dialog', html);
	dom_show('app-dialog');		
	if (modal) dom_show('app-click-catcher');		
}

//---------------------------------------------------------------------------
function app_dialog_hide() {
	dom_hide('app-dialog');		
	dom_hide('app-click-catcher');		
    document.getElementById('app-dialog').className=false;
}

//---------------------------------------------------------------------------
function app_dialog(html) {
	app_dialog_show(html, false);		
}

//---------------------------------------------------------------------------
function app_dialog_modal(html) {
	app_dialog_show(html, true);		
}


// ------------------------------------------------------------------------
// DOM Functions
// ------------------------------------------------------------------------		

//---------------------------------------------------------------------------
function dom_insert_html(id, html) {
   	document.getElementById(id).innerHTML = document.getElementById(id).innerHTML + html;
}
//---------------------------------------------------------------------------
function dom_set_html(id, html) {
    document.getElementById(id).innerHTML = html;
}
//---------------------------------------------------------------------------
function dom_get_html(id) {
    return document.getElementById(id).innerHTML;
}
//---------------------------------------------------------------------------
function dom_load_url(id, url, showWaitImage) {
    ajax_load_url(url, id, showWaitImage);
}
//---------------------------------------------------------------------------
function dom_set_img(id, src, height, width) {
    document.getElementById(id).src = src;
    if (height > 0) document.getElementById(id).height = height;
    if (width > 0) document.getElementById(id).width = width;
}
//---------------------------------------------------------------------------
function dom_toggle_visibility(id)
{
	var obj=document.getElementById(id);
	obj.style.display=((obj.style.display=='none') ? '' : 'none');
}
//---------------------------------------------------------------------------
function dom_show(id)
{
	var obj=document.getElementById(id);
	obj.style.display='';
}
//---------------------------------------------------------------------------
function dom_hide(id)
{
	var obj=document.getElementById(id);
	obj.style.display='none';
}

//---------------------------------------------------------------------------
function dom_stop_event(e) {
   if (e.stopPropagation) {  
     e.stopPropagation();
   } else {
     e.cancelBubble = true;
   }
}

//---------------------------------------------------------------------------
function dom_trigger_child_scripts_in_obj(obj) {
    var i=0;
    if (obj.hasChildNodes()) { 
      for (i=0; i<obj.childNodes.length; i++) { 
           if (obj.childNodes[i].tagName == "SCRIPT") {
             eval(obj.childNodes[i].innerHTML);
           } else {
              // Trigger scripts within a child
              dom_trigger_child_scripts_in_obj(obj.childNodes[i]);
           }
      }
    }  
}

//---------------------------------------------------------------------------
function dom_trigger_child_scripts(id) {
    var obj=document.getElementById(id);  
    dom_trigger_child_scripts_in_obj(obj);
}

//-------------------------------------------------------------
function dom_get_mouse_coord(e, refID, returnX) { 

	var posx = 0;
	var posy = 0;

	if (!e) var e = window.event;

	if (e.pageX || e.pageY)
	{
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY)
	{
		posx = e.clientX + document.body.scrollLeft;
		posy = e.clientY + document.body.scrollTop;
	}

	// posx and posy contain the mouse position relative to the document

	c = document.getElementById(refID);

	LeftX = dom__getRealLeft(c); 
	TopY  = dom__getRealTop(c); 
	
	x = (posx - LeftX);
	y = (posy - TopY);

	if (returnX == true) return x.toFixed(0);
	if (returnX == false) return y.toFixed(0);
}

//-------------------------------------------------------------
function dom__getRealLeft(el) { 

     if (arguments.length==0) el = this; 
     xPos = el.offsetLeft; 
     tempEl = el.offsetParent; 
     while (tempEl != null) { 
         xPos += tempEl.offsetLeft; 
         tempEl = tempEl.offsetParent; 
     } 
     return xPos; 
 } 

//-------------------------------------------------------------
function dom__getRealTop(el) { 

     if (arguments.length==0) el = this; 

     yPos = el.offsetTop; 
     tempEl = el.offsetParent; 

     while (tempEl != null) { 
         yPos += tempEl.offsetTop; 
         tempEl = tempEl.offsetParent; 
     } 
     return yPos; 
 } 

 
//-------------------------------------------------------------
function form_get_post_param(id) {

  var PostStr='';     
  var i=0;
  var formSubmitElementName=false;
  
  obj=document.getElementById(id);
  
  for (i=0; i<obj.elements.length; i++) {
  
     // In order to be able to know which submit object has been clicked, a hidden field should be defined
     // in the form to hold its name and the onClick event must be used to set is value. This field should be
     // defined in the form before any submit object.
     // If the field is not defined, the submit element name will not be posted.
     if (obj.elements[i].name == 'formSubmitElementName') formSubmitElementName=obj.elements[i].value;  
   
     if (obj.elements[i].tagName == "INPUT") {

        if (obj.elements[i].type == "checkbox") {
           if (obj.elements[i].checked) {
              PostStr += obj.elements[i].name + "=" + obj.elements[i].value + "&";
           } else {
              PostStr += obj.elements[i].name + "=&";
           }
           
        } else if (obj.elements[i].type == "radio") {
           if (obj.elements[i].checked) {
              PostStr += obj.elements[i].name + "=" + obj.elements[i].value + "&";
           }           
        } else if (obj.elements[i].type == "submit") {     
            // If formSubmitElementName is defined (should be set on the submit object's onClick event), 
            // we POST only the submit element which trigger the form submit (this is the normal behaviour
            // for a form).
            if (formSubmitElementName == obj.elements[i].name) {
                PostStr += obj.elements[i].name + "=" + obj.elements[i].value + "&";                
            }          
        } else {
            PostStr += obj.elements[i].name + "=" + obj.elements[i].value + "&";                
        }
        
     } else if (obj.elements[i].tagName == "SELECT") {
        var sel = obj.elements[i];
        if (sel.options.length>0) PostStr += sel.name + "=" + sel.options[sel.selectedIndex].value + "&";
        
     } else if (obj.elements[i].tagName == "TEXTAREA") {
           PostStr += obj.elements[i].name + "=" + obj.elements[i].value + "&";                
     } else {
     }
     
  }
  return PostStr;
}

// ------------------------------------------------------------------------
// AJAX Functions
// ------------------------------------------------------------------------		

var xhr=false;
var xhr_target=false;

//---------------------------------------------------------------------------
function ajax_get_request_object() {

	xhr=false;
	
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		xhr = new XMLHttpRequest();
		if (xhr.overrideMimeType) {
			xhr.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			xhr = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
			xhr = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if (!xhr) {
		msg('Cannot create an XMLHTTP instance');
		return false;
	}	
	xhr.onreadystatechange = ajax_handle_response;
	return xhr;
}

//---------------------------------------------------------------------------
function ajax_post_form(id, method, url, target) {

    parameters=form_get_post_param(id); 
    if (!method) method='POST';
    if(method.toLowerCase() == 'get') url = url+"?"+parameters; 
    
    xhr_target=target;
    xhr=ajax_get_request_object();
	xhr.open(method, url, true); // asynchronous	
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhr.setRequestHeader("Content-length", parameters.length);
    xhr.setRequestHeader("Connection", "close");
    xhr.send(parameters);
}

//---------------------------------------------------------------------------
function ajax_load_url(url, target, showWaitImage) {
    xhr_target=target;
    xhr=ajax_get_request_object();
	xhr.open('GET', url, true); // asynchronous
    xhr.setRequestHeader("Content-type", "text/html");
	xhr.send(null); 
    if (showWaitImage) {
        dom_set_html(target, '<center><img src="../themes/ajax_load_studio.gif"></img></center>'); 
    }
}

//---------------------------------------------------------------------------
function ajax_handle_response() {
 
    if(xhr.readyState == 4){ 
    	if (xhr.status == 200) {
    	
    		var responseText = xhr.responseText;
    		var DOMdocument  = xhr.responseXML;

    		if (document.getElementById(xhr_target)) {
                
                dom_set_html(xhr_target, responseText);
                
                // All scripts within the response have to be executed explicitely
                // as they are not executed when setting the innerHMTL
                dom_trigger_child_scripts(xhr_target);
            } else {
                alert('Destination does not exists');
            }
    	} else {
    		alert('There was a problem with the request ('+xhr.status+')');
    	}
    }
}

// ------------------------------------------------------------------------
// Validation of fields used in package 'class.form.inc.' (event 'onBlur')
// ------------------------------------------------------------------------		

// Verif number format (0-9)
function f_verifNumber(field, msg){	
	var valid = 1;
	var GoodChars = "0123456789";
	var i = 0;
	var number = field.value;

	for (i = 0; i <= number.length - 1; i++) {
		if (GoodChars.indexOf(number.charAt(i)) == -1) {
			valid = 0;
			break;
		}
	}
	if (valid==0) alert(msg);
	return valid;
}

// Verify text format
function f_verifText(field,value){
	// Do nothing (because this procedure is called only for TextArea Field)	
}

// Verify date format 
function f_verifDate(field,format,msg){

	var lb_date_validate = 1;
	var ld_date = field.value;
	var ll_date = ld_date.length;
	var format1 = "";
	var format2 = "";
	var format3 = "";
	
	// Return if field is empty
	if (ld_date == '') return 0;

	// Recherche le séparateur utilisé pour le format de date (config)
	if (format.indexOf('.') > 0) separator = '.';
	else if (format.indexOf('/') > 0) separator = '/';
	else if (format.indexOf('-') > 0) separator = '-';

	// Obtenir le format de la date (D M Y)
	str = format.split(separator);
	format1 = str[0];
	format2 = str[1];
	format3 = str[2]; 
	
	// Recherche si le séparateur utilisé dans la saisie de la date est valide
	if ((ld_date.indexOf('.') > 0) && (ld_date.lastIndexOf('.') > 0)) separator = '.';
	else if ((ld_date.indexOf('/') > 0) && (ld_date.lastIndexOf('/') > 0)) separator = '/';
	else if ((ld_date.indexOf('-') > 0) && (ld_date.lastIndexOf('-') > 0)) separator = '-';
	else lb_date_validate = 0;

	// Test si la date insérée n'est pas trop grande
	if (ll_date > 10) lb_date_validate = 0;
	
	// Test le premier digit
	digit = ld_date.indexOf(separator);
	if (digit != (format1.length)) {
		if ((format1.length == 4) || (digit > 2) || (digit < 1)) lb_date_validate = 0;
	}

	// Test le deuxième digit
	digit = ld_date.length - (ld_date.indexOf(separator) + (ld_date.length - ld_date.lastIndexOf(separator) + 1));
	if (digit != (format2.length)) {
		if ((format2.length == 4) || (digit > 2) || (digit < 1)) lb_date_validate = 0;
	}

	// Test le dernier digit
	digit = ld_date.length - ld_date.lastIndexOf(separator) - 1;
	if (digit != (format3.length)) {
		if ((format3.length == 4) || (digit > 2) || (digit < 1)) lb_date_validate = 0;
	}

	if (lb_date_validate == 0) 
	{
		alert(msg);
		field.focus();
		return 0;
	}
	return 1;
}

// Verify datetime format
function f_verifDateTime(field,date_format,hour_format,msg) {

	var lb_datetime_validate = 1;
	var ld_datetime = field.value;
	var ll_datetime = ld_datetime.length;
	
	// Return if field is empty
	if (ld_datetime == '') return 0;
		
	// Obtient la date uniquement, sans les heures
	var datetime = field.value.split(" ");
	var ld_date = datetime[0];
	var lb_date_validate = 1;
	var ll_date = ld_date.length;
	var format1 = "";
	var format2 = "";
	var format3 = "";

	// Return if field is empty
	if (ld_date == '') return 0;

	// Recherche le séparateur utilisé pour le format de date (config)
	if (date_format.indexOf('.') > 0) separator = '.';
	else if (date_format.indexOf('/') > 0) separator = '/';
	else if (date_format.indexOf('-') > 0) separator = '-';

	// Obtenir le format de la date (D M Y)
	str = date_format.split(separator);
	format1 = str[0];
	format2 = str[1];
	format3 = str[2]; 
	
	// Recherche si le séparateur utilisé dans la saisie de la date est valide
	if ((ld_date.indexOf('.') > 0) && (ld_date.lastIndexOf('.') > 0)) separator = '.';
	else if ((ld_date.indexOf('/') > 0) && (ld_date.lastIndexOf('/') > 0)) separator = '/';
	else if ((ld_date.indexOf('-') > 0) && (ld_date.lastIndexOf('-') > 0)) separator = '-';
	else lb_date_validate = 0;

	// Test si la date insérée n'est pas trop grande
	if (ll_date > 10) lb_date_validate = 0;
	
	// Test le premier digit
	digit = ld_date.indexOf(separator);
	if (digit != (format1.length)) {
		if ((format1.length == 4) || (digit > 2) || (digit < 1)) lb_date_validate = 0;
	}

	// Test le deuxième digit
	digit = ld_date.length - (ld_date.indexOf(separator) + (ld_date.length - ld_date.lastIndexOf(separator) + 1));
	if (digit != (format2.length)) {
		if ((format2.length == 4) || (digit > 2) || (digit < 1)) lb_date_validate = 0;
	}

	// Test le dernier digit
	digit = ld_date.length - ld_date.lastIndexOf(separator) - 1;
	if (digit != (format3.length)) {
		if ((format3.length == 4) || (digit > 2) || (digit < 1)) lb_date_validate = 0;
	}
	
	// Obtient les heures et les minutes uniquement, sans la date
	var lb_time_validate = 1;
	
	if (typeof(datetime[1]) == "undefined") {
		lb_time_validate = 0;
	} else {	
		var lt_hour = datetime[1];
		
		// Recherche si les heures et les minutes sont séparés par les ':'
		if (lt_hour.indexOf(':') == -1 ) lb_time_validate = 0;
		if (lt_hour.length > 5 ) lb_time_validate = 0;
	}
	
	if ((lb_datetime_validate == 0) || (lb_date_validate == 0) || (lb_time_validate == 0))
	{
		alert(msg);
		field.focus();
		return 0;
	}
	return 1;
}
