

// JavaScript Document
// process urls and turn them into ajax actions
function AjaxAction() {
    
}

AjaxAction.pageStructureChangeEventOccured = function(anEvent) {
    var myElement = anEvent.getElement();
    $(myElement).click(AjaxAction.linkOnclick);
}

/**
 * openChildInParent means that this data should be sumitted as form. The rules are:
 * <ul>
 *    <li>Only open in parent, if ajaxContainer has cssClass 'OpenChildInParent'
 *    <li> if changed filtering, or changed list order, do not open in parent; else open child in parent.
 * </ul>  
 * @return true if should do so, false otherwise. 
 */   
AjaxAction.openChildInParent = function(anElement) {
    var myRet = false;

   var container= $(anElement).parents(".AjaxContainer:first");
   
   
   myRet = container.hasClass("OpenChildInParent");
   if (myRet)
   {
        var trEl = $(anElement).parents("tr:first");
        myRet = myRet && !(trEl.hasClass("filter") || trEl.hasClass("header"));
   }
   
   return myRet;
}

/**
 * Handles ajax action link onclick, but is actually only executed for 'a' tags which are suitable for ajax.
 * We are suitable if:
 * <ul>
 *  <li> current tag is an 'a', or parent of current is 'a'
 *  <li> this 'a' has a 'action' css class
 *  <li> this 'a' has *no* 'noAjax' css class.
 * </ul>
 */
AjaxAction.linkOnclick = function(event) {
    var target = event.target;
    if (!$(target).is("a")) {
        target = $(target).parents("A:first");
        if (target.length) {
            target = target[0];
        }
    }
    
    var $target = $(target);
    var handle = $target.is("A");
    handle = handle && $target.hasClass("action");
    handle = handle && !$target.hasClass("noAjax");
    
    if(!handle) {
        // no ajax action: perform browser action.
        return true; 
    }

    var myRet=true;
    
    var myAjaxContainer = AjaxRequestManager.getParentContainerForElement(target);
    
    if (myAjaxContainer == null) {
       myAjaxContainer = document.getElementById(AjaxRequestManager.defaultElement);
    }
    
    if (AjaxRequestManager.isProcessing()) {
        var myMessageElement = document.getElementById("alreadyProcessing");
        var myMessage = "Already processing, please wait";
        if (myMessageElement) {
            myMessage = myMessageElement.value;
        }
        alert(myMessage);
        return false;
    }
    var additionalParams = new Object();
    
    var containerParams = AjaxRequestManager.getFlowParamsForElement(target);
    if ($(target).hasClass("attachCurrentParameters")) {
        additionalParams = $.extend(new Object(), containerParams, additionalParams);
    }
    
    var myNextElement = null;
	var $form = $(target).parents(".entityForm");
	var $myNextElement = $(".nextAction", $form);
	if ($myNextElement.length) {
		myNextElement = $myNextElement[0];
	}

	var myForm = null;
	if ($form.length) {
		myForm = $form[0];
	}

	if (myNextElement == null) {
		myNextElement = document.createElement("input");
		myNextElement.setAttribute("class", "nextAction");

		myNextElement.setAttribute("name", "nextAction");
		myNextElement.name = "nextAction";
		myNextElement.setAttribute("type", "hidden");

		if (myForm != null) {
			myForm.appendChild(myNextElement);
		}
	}
	var nextElementValue = target.href;

	var newParams = new Object();
	if (additionalParams) {
		var allParamsInStr = nextElementValue.substr(nextElementValue
				.indexOf('?') + 1);
		var elementArray = allParamsInStr.split("&");
		for ( var i = 0; i < elementArray.length; i++) {
			var myParam = elementArray[i];
			var myName = myParam.substr(0, myParam.indexOf("="));
			var myValue = myParam.substr(myParam.indexOf("=") + 1);
			newParams[myName] = myValue;
		}
		// escape additional parameters (current are already parsed from urls, thus already escaped)
		for ( var myName in additionalParams) {
			additionalParams[myName] = escape(additionalParams[myName]);
		}
		
		newParams = $.extend(new Object(), additionalParams, newParams);
		nextElementValue = "?1=1";
		
		for ( var myName in newParams) {
			nextElementValue += "&" + myName + "=" + newParams[myName];
		}
	}

	myNextElement.setAttribute("value", nextElementValue);
	myNextElement.value = nextElementValue;

    if (AjaxAction.openChildInParent(target)) {
        if (myForm != null) {
            gloEntityForm.doSubmit("saveAndNext", $target);
        } else {
            var ajaxContainer = null;
            var $containers = $(target).parents(".AjaxContainer");
            if ($containers.length > 1) {
                ajaxContainer = $containers[1];
            }
            AjaxRequestManager.createNewRequest(target, ajaxContainer, additionalParams);
        }
    } else if (target.className.match("reload")) {
        var myAjaxContainer = AjaxRequestManager.getParentContainerForElement(target);
        var myParamArray = AjaxRequestManager.getParamsFor(target.href);
        
        // no additional params required: we reload the current
        AjaxRequestManager.reloadCurrent(myAjaxContainer, myParamArray);
    } 
    else  { // not: open in parent
        var params = new Object();
        if (target.className.match("resetFlow")) {
            myAjaxContainer.flowLevel = null;
        } 
        
        if (myForm != null && myAjaxContainer.flowLevel) {
            gloEntityForm.doSubmit("saveAndNext", $target);
        }
        else {
	    	AjaxRequestManager.createNewRequest(target, myAjaxContainer, additionalParams);
        }
    }
    return false;
}



PageRequest.addOnPageStructureChangeEvent(AjaxAction.pageStructureChangeEventOccured);
