/*
  Builds an object to handle form requests.
*/
var NssForm = {

	/*
	  Serialize the given form parameters, avoid sending any
	  action related information
	*/
	serialize: function(form) {
    	var elements = Form.getElements($(form));
	    var queryComponents = new Array();

    	for (var i = 0; i < elements.length; i++) {
			var queryComponent = Form.Element.serialize(elements[i]);
			if (queryComponent) {
				if (! queryComponent.startsWith('br.atech.foundation_action')) {
        			queryComponents.push(queryComponent);
        		}
        	}
    	}

		return queryComponents.join('&');
  	},

  	/*
  	 submit the given form to the given url
  	*/
  	submitForm: function(form, url) {
  		$(form).action = url;
  		$(form).submit();
  	},

  	/*
  	 submit the given form to the given url, if the user confirms this action
  	*/
  	submitFormOnConfirmation: function(form, url, msg) {
		var go = confirm(msg);
		if (go == true) {
			NssForm.submitForm(form, url);
		}
	}
}



// Serialize the parameters enclosed in a given area
// could not use form.serialize, because this one sent
// submit parameters with the form data.
function serializeAreaParameters(divNames) {
    if ( divNames != null ) {
    	var divResults = new Array();
    	for (var i = 0; i < divNames.length; i++) {
			divResults.push(NssForm.serialize($(divNames[i])));
		}
		return divResults.join('&');
	}else {
	 	return null;
	}
}





// executes the okFunc if the user confirms the presented message
// Do notthing otherwise
function redirectOnConfirmation(okPath, confirmationMessage)
{
	var go = confirm(confirmationMessage);

	if (go == true)
		window.location = okPath;
}



// Show window function. The main reason to use
//  this one is to center the popup on the screen
function showWindow(url, name, wid, hei, params)
{
	w = screen.width;
	h = screen.height;
	w_center = w/2;
	h_center = h/2;

	w_aux = wid/2;
	h_aux = hei/2;
	h_top = h_center-h_aux;
	w_left = w_center-w_aux;

	searchWindow = window.open(url, name,'width=' + wid + ',height=' + hei + ',top=' + h_top + ',left=' + w_left + ',' + params);
	if (window.focus) {
		searchWindow.focus()
	}
	return searchWindow;
}

/*
 * This variable exists to be possible to pass the confirmation 
 * answer to more than one function, without using the function
 * return
 */
var global_confirmation = true;


function parse(data) {
	var parsed = [];
	var rows = data.split("\n");
	for (var i=0; i < rows.length; i++) {
		var row = rows[i];
		if (row) {
			row = row.split("|");
			parsed[parsed.length] = {
				data: row,
				value: row[0]
			};
		}
	}
	return parsed;
};

/*
	Builds a function to add a given element to a given area.
	Before this, we used to build a custom function for each
	area, but using url encoded actions made it easier to
	use this function giving only parameters.
*/
var NssArea = {
		
	doAjaxExactSearch: function() {
		// mandatory arguments
		var targetArea = arguments[0];
		var targetUrl = arguments[1];
		var button = arguments[2];
		var urlSelect = arguments[3];
		var paramName = arguments[4];
		var parameters = arguments[5];
		var postDivs = new Array();
		
		if (arguments.length == 6) {
			// source area not specified, let's use the source as the target
			postDivs.push(targetArea);
		} else {
			for (var i = 6; i < arguments.length; i++) {
				postDivs.push(arguments[i]);
			}
		}
		targetUrl = addParameter(targetUrl,'ajaxRequest', 'true');
		targetUrl = addParameter(targetUrl,'ajaxId', targetArea);
		targetUrl = addParameter(targetUrl,'ajaxApplied', 'true');
		targetUrl = addParameter(targetUrl,'autocompleteShowFields', 'id');
		targetUrl = addParameter(targetUrl,'exactSearchRequest', 'true');
		if ( paramName != button.name ){
			targetUrl = addParameter(targetUrl,paramName, button.value);
		}
		if ( parameters ) {
			var params = parameters.split("&");
			for (var i=0; i < params.length; i++) {
				targetUrl = addParameter(targetUrl,params[i].substring(0,params[i].indexOf("=")), params[i].substring(params[i].indexOf("=")+1));
			}
		}
		new Ajax.Request(targetUrl,
			{
				method: 'post',
				parameters: serializeAreaParameters($(postDivs)),
				evalScripts: true,
                asynchronous: false,
				onCreate: function(){
					includeIndicator(targetArea);
				},
				onComplete: function(transport) {
					if ( transport.responseText == "" ) {
				    	removeIndicator(targetArea);
					}else{
						var data = parse(transport.responseText);
						urlSelect = urlSelect.replace('9999999999999',data[0].value);
						NssArea.doAjaxRequest(targetArea,urlSelect);
					}
                }
			});
	},

	doAjaxRequestForRefresh: function() {
		// mandatory arguments
		var targetArea = arguments[0];
		var targetUrl = arguments[1];
		var postDivs = new Array();
		if (arguments.length == 2) {
			// source area not specified, let's use the source as the target
			postDivs.push(targetArea);
		} else {
			for (var i = 2; i < arguments.length; i++) {
				postDivs.push(arguments[i]);
			}
		}
		new Ajax.Updater(targetArea,targetUrl+"?ajaxRequest=true&ajaxId="+targetArea,
			{
				method: 'post',
				parameters: serializeAreaParameters($(postDivs)),
				evalScripts: true,
				onCreate: function(){
					includeIndicator(targetArea);
				}
			});
	},

 	/*
 	  Add the give element id to the specified area.
 	  Area must be specified as a string
 	  params: targetArea, targetUrl, button
 	*/
	doAjaxRequest: function() {
		// mandatory arguments
		var targetArea = arguments[0];
		var targetUrl = arguments[1];
		var button = arguments[2];
		var postDivs = new Array();
		if (arguments.length == 3) {
			// source area not specified, let's use the source as the target
			postDivs.push(targetArea);
		} else {
			for (var i = 3; i < arguments.length; i++) {
				postDivs.push(arguments[i]);
			}
		}
		targetUrl = addParameter(targetUrl, 'ajaxRequest', 'true');
		targetUrl = addParameter(targetUrl,'ajaxId', targetArea);
		new Ajax.Updater(targetArea,targetUrl,
			{
				method: 'post',
				parameters: serializeAreaParameters($(postDivs)),
				evalScripts: true,
				onCreate: function(){
					includeIndicator(targetArea);
				}
			});
	},
	
	/*
 	  Add the give element id to the specified area, but requests a confirmation before.
 	  Area must be specified as a string
 	*/
	doAjaxRequestOnConfirmation: function(targetArea, targetUrl, button, msg) {
		if(document.popup){
			var caller = document.popup;
		}else{
			var caller = window;
		}
		var postDivs = new Array();
		postDivs.push(targetArea);
		global_confirmation = caller.confirm(msg);
		if (global_confirmation == true) {
			global_confirmation = true;
			targetUrl = addParameter(targetUrl, 'ajaxRequest', 'true');
			targetUrl = addParameter(targetUrl, 'ajaxId', targetArea);
			new Ajax.Updater(targetArea,targetUrl,
			{
					method: 'post',
					parameters: serializeAreaParameters($(postDivs)),
					evalScripts: true,
					onCreate: function(){
						includeIndicator(targetArea);
					}
			});
		}
	},
	doAjaxUpdate: function(div, url){
		if(ispopup()){
			var boolean_confirmation = window.opener.global_confirmation;
		}else{
			var boolean_confirmation = window.global_confirmation;
		}
		if(boolean_confirmation){
			var postDivs = new Array();
			postDivs.push(div);
			targetUrl = addParameter(url,'ajaxRequest', 'true');
			targetUrl = addParameter(url, 'ajaxId', div);
			new Ajax.Updater(div, url,
			    {
	  				parameters: serializeAreaParameters($(div)),
					evalScripts: true,
					onCreate: function(){
						includeIndicator(div);
					}
					,onComplete:function(transport){
						if($(div).tagName == 'FORM'){
							$(div).replace(transport.responseText)
						}
					}
				});	
		}
		if(ispopup()){
			window.opener.global_confirmation = true;
		}else{
			window.global_confirmation = true;
		}
	}
}

/*
Show error messages from ajax requests using Prototype functions
*/
function logErrors(erro){
    alert(erro);
	var log = log4javascript.getDefaultLogger();
	log.error(erro);
}

/*
  Call Calendar function, to use alternative function, just set var alternativeCalendar to true
  
  something like that :
  
  alternativeCalendar = false;
  function openAlternativeCalendar(targetName){
	  alert(targetName);
  }
*/
var alternativeCalendar = false;

function openCalendarTag(targetName,imagePath){
	if ( alternativeCalendar ) {
	  openAlternativeCalendar(targetName);
	}else{
	  openCalendar(targetName,imagePath); 
	}
}

/*
  Modal Functions
*/
var NssModal = {
 	/*
 	  Add the give element id to the specified area.
 	  Area must be specified as a string
 	*/
	doAjaxRequest: function(divOrigin, divTarget, targetUrl) {
	    var postDivs = new Array();
		postDivs.push(divOrigin);
		targetUrl = addParameter(targetUrl,'ajaxRequest', 'true');
		targetUrl = addParameter(targetUrl, 'ajaxId', divTarget);
	    new Ajax.Updater(divTarget,targetUrl,
			{
				method: 'post',
				parameters: serializeAreaParameters($(postDivs)),
				evalScripts: true,
				onCreate: function(){
					includeIndicator(divTarget);
				}
								
			});
	},

	doAjaxRequestModalErrors: function(divOrigin, divTarget, targetUrl) {
	    var postDivs = new Array();
		postDivs.push(divOrigin);
		targetUrl = addParameter(targetUrl,'ajaxRequest', 'true');
		targetUrl = addParameter(targetUrl, 'ajaxId', divTarget);
		var returnErrors = false;
		new Ajax.Request(targetUrl, {
			  method: 'post',
			  asynchronous: false,
			  parameters: serializeAreaParameters($(postDivs)),
				evalScripts: true,
				onCreate: function(){
					includeIndicator(divTarget);
			  },
			  onComplete: function(transport) {
				var targetUpdate = $(divTarget);
			    if (transport.responseText.match('id="'+divTarget+'"') || transport.responseText.match("id='"+divTarget+"'")) {
			      targetUpdate = $(divTarget);
			      returnErrors = true;
			    }else{
			    	removeIndicator(divTarget);
			    	targetUpdate = $(divOrigin);
			    }
                targetUpdate.update(transport.responseText);
                if($(targetUpdate).tagName == 'FORM'){
					$(targetUpdate).replace(transport.responseText)
				}
			  }
			});
		return returnErrors;
	},	
	/**
	  Do the ajax request for this window with doSearch and doSelect actions
	*/
	doAjaxUpdateModal: function(divOrigin, targetUrl) {
	    var postDivs = new Array();
		postDivs.push(divOrigin);
		targetUrl = addParameter(targetUrl,'ajaxRequest', 'true');
		targetUrl = addParameter(targetUrl, 'ajaxId', divOrigin);
		new Ajax.Updater("modal_dialog_message", targetUrl,
		    {
	  			parameters: serializeAreaParameters($(postDivs)),
				evalScripts: true,
				onCreate: function(){
					includeIndicator(divOrigin);
				}
		    });
	}
}

/*
  return wait content for ajax functions
  
  to use alternative content, trying something like that :
  
  alternativeWaitContent = true;
  function performAlternativeWaitContent(nameDiv){
  }
   
*/
var alternativeWaitContent = false;
function waitContent(nameDiv){
  if ( alternativeWaitContent ) {
    return performAlternativeWaitContent(nameDiv);
  }else{
  	return "<div id='"+nameDiv+"'><h2>Aguarde...</h2></div>";
  }
}

function includeIndicator(targetArea) {
	if($(targetArea + '_indicator')) {
    	Element.remove(targetArea + '_indicator');
    }
    new Insertion.Top(targetArea, '<div style="left: right;position:absolute;background-color:red;color:white;font-weight: bold;font-family: Verdana; font-size: 12px;" id="'+targetArea+'_indicator">&nbsp;Aguarde...&nbsp;</div>');
}

function removeIndicator(targetArea) {
	if($(targetArea + '_indicator')) {
    	Element.remove(targetArea + '_indicator');
    }
}

function addParameter( queryString, parameterName, parameterValue ) {
	if(queryString.indexOf('?') != -1){
		var parameterName = parameterName + '=';
		begin = queryString.indexOf(parameterName);
		if ( begin != -1 ) {
			begin += parameterName.length;
			end = queryString.indexOf ( '&' , begin );
			var newUrl = queryString.substring(0, begin);
			newUrl = newUrl + parameterValue;
			if ( end != -1 ) {
				newUrl = newUrl + queryString.substring(end, queryString.length);
			}
			queryString = newUrl;
			
		}else{
			queryString = queryString + '&'+parameterName+parameterValue;
		}		
	}else{
		queryString = queryString + '?'+parameterName+'='+parameterValue;
	}
	return queryString;
}

function getParameter(source, name ){
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( source );
  if( results == null )
    return "";
  else
    return results[1];
}

function ispopup(){
	try{
		//it's ugly do try catch to see if it is a popup, anyway i don't another way
		window.opener.global_confirmation;
		return true;
	}catch(error){
		return false;
	}
}
