/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/

// ================= FIELD LOOKUP METHODS ============================
var NS4 = (navigator.appName.indexOf("Netscape") >= 0 && ! document.getElementById)? true: false;
var IE4 = (document.all && ! document.getElementById)? true: false;
var IE5 = (document.getElementById && document.all)? true: false;
var NS6 = (document.getElementById && navigator.appName.indexOf("Netscape") >= 0)? true: false;
var mx, my;
var ACTIVATED_LOOKUP = null;
var LOOKUP_DIV = null;
var INITIALLY_COLLAPSED = null;
var SHOW_DESCRIPTION = false;


function moveobj(evt) {
    if (NS4 || NS6) {
        mx = evt.screenX;
        my = evt.screenY;
    } else if (IE5 || IE4) {
        mx = event.screenX;
        my = event.screenY;
    }
}

var target = null;
var target2 = null;
var targetW = null;
var lookups =[];

function call_fieldlookup(target, viewName, formName, viewWidth, viewheight) {
    var fieldLookup = new fieldLookup1(target);
    if (! viewWidth) viewWidth = 350;
    if (! viewheight) viewheight = 200;
    fieldLookup.popup(viewName, formName, viewWidth, viewheight);
}
function call_fieldlookupLayer(target, viewName, lookupWidth, lookupHeight, lookupPosition, fadeBackground, initiallyCollapsed) {
    if (isEmpty(target) || isEmpty(viewName)) {
        return lookup_error("Lookup can't be created, one of these variables is missing: target=" + target + " viewName=" + viewName);
    }

    var fieldLookupPopup = new FieldLookupPopup(target, viewName, lookupWidth, lookupHeight, lookupPosition, fadeBackground, initiallyCollapsed, arguments);
    fieldLookupPopup.showLookup();
    this.target = target;
}

function call_fieldlookupLayer3(target, target2, viewName, lookupWidth, lookupHeight, lookupPosition, fadeBackground, initiallyCollapsed) {
    if (isEmpty(target) || isEmpty(target2) || isEmpty(viewName)) {
        return lookup_error("Lookup can't be created, one of these variables is missing: target=" + target + " target2=" + target2 + " viewName=" + viewName);
    }

    var fieldLookupPopup = new FieldLookupPopup(target, viewName, lookupWidth, lookupHeight, lookupPosition, fadeBackground, initiallyCollapsed, arguments);
    fieldLookupPopup.showLookup();
    this.target = target;
    this.target2 = target2;
}

function call_fieldlookup2(target, viewName, presentation) {
    var fieldLookup = new fieldLookup1(target, arguments, presentation);
    fieldLookup.popup2(viewName);
}

function call_fieldlookup3(target, target2, viewName, presentation) {
    var fieldLookup = new fieldLookup2(target, target2, arguments, presentation);
    fieldLookup.popup2(viewName);
}

function fieldLookup1(obj_target, args, presentation) {
    this.args = args;
    this.presentation = presentation;
    // passing methods
    this.popup = lookup_popup1;
    this.popup2 = lookup_popup2;
    
    // validate input parameters
    if (! obj_target) return lookup_error("Error calling the field lookup: no target control specified");
    if (obj_target.value == null) return lookup_error("Error calling the field lookup: parameter specified is not valid target control");
    targetW = obj_target;
}

function fieldLookup2(obj_target, obj_target2, args, presentation) {
    this.args = args;
    this.presentation = presentation;
    // passing methods
    this.popup = lookup_popup1;
    this.popup2 = lookup_popup2;
    // validate input parameters
    if (! obj_target) return lookup_error("Error calling the field lookup: no target control specified");
    if (obj_target.value == null) return lookup_error("Error calling the field lookup: parameter specified is not valid target control");
    targetW = obj_target;
    // validate input parameters
    if (! obj_target2) return lookup_error("Error calling the field lookup: no target2 control specified");
    if (obj_target2.value == null) return lookup_error("Error calling the field lookup: parameter specified is not valid target2 control");
    target2 = obj_target2;
    
}

function lookup_popup1(view_name, form_name, viewWidth, viewheight) {
    var obj_lookupwindow = window.open(getViewNameWithSeparator(view_name) + 'formName=' + form_name + '&presentation=' + this.presentation + '&id=' + this.id, '_blank', 'width=' + viewWidth + ',height=' + viewheight + ',scrollbars=yes,status=no,resizable=yes,top=' + my + ',left=' + mx + ',dependent=yes,alwaysRaised=yes');
    obj_lookupwindow.opener = window;
    obj_lookupwindow.focus();
}
function lookup_popup2(view_name) {
    var argString = "";
    if (this.args != null) {
        if (this.args.length > 2) {
            for (var i = 2; i < this.args.length; i++) {
                argString += "&parm" + (i - 3) + "=" + this.args[i];
            }
        }
    }

    var obj_lookupwindow = window.open(getViewNameWithSeparator(view_name) + 'presentation=' + this.presentation + '&id=' + this.id + argString, '_blank', 'width=900,height=700,scrollbars=yes,status=no,resizable=yes,top=' + my + ',left=' + mx + ',dependent=yes,alwaysRaised=yes');
    obj_lookupwindow.opener = window;
    obj_lookupwindow.focus();
}
function lookup_error(str_message) {
    var CommonErrorMessage2 = getJSONuiLabel("CommonUiLabels", "CommonErrorMessage2");
    showErrorAlert(CommonErrorMessage2, str_message);
    return null;
}

function getViewNameWithSeparator(view_name) {
    var sep = "?";
    if (view_name.indexOf("?") >= 0) {
        sep = "&";
    }
    return view_name + sep;
}

function initiallyCollapse() {
    if ((!LOOKUP_DIV) || (INITIALLY_COLLAPSED != "true")) return;
    var slTitleBars = LOOKUP_DIV.getElementsByClassName('screenlet-title-bar');
    for (i in slTitleBars) {
        var slTitleBar = slTitleBars[i];
        var ul = slTitleBar.firstChild;
        if ((typeof ul) != 'object') continue;

        var childElements = ul.childNodes;
        for (j in childElements) {
            if (childElements[j].className == 'expanded' || childElements[j].className == 'collapsed') {
                break;
            }
        }        
        var childEle = childElements[j].firstChild;
        CollapsePanel(childEle, 'lec' + COLLAPSE);
        break;
    }
}

function CollapsePanel(link, areaId){
    var container = $(areaId);
    var liElement = $(link).up('li');
    liElement.removeClassName('expanded');
    liElement.addClassName('collapsed');
    Effect.toggle(container, 'appear');
}

function initiallyCollapseDelayed() {
    setTimeout("initiallyCollapse()", 400);
}


/*************************************
* Fieldlookup Class & Methods
*************************************/
function ConstructLookup(requestUrl, inputFieldId, dialogTarget, dialogOptionalTarget, formName, width, height, position, modal, ajaxUrl, showDescription, presentation, defaultMinLength, defaultDelay, args) {
    
    // add the presentation attribute to the request url to let the request know which decorator should be loaded
    if(!presentation) {
      var presentation = "layer"
    }    
    requestUrl = getViewNameWithSeparator(requestUrl) + "presentation=" + presentation;
    
    // create Link Element with unique Key
    var lookupId = GLOBAL_LOOKUP_REF.createNextKey();
    var inputBox = document.getElementById(inputFieldId);
    newInputBoxId = lookupId + "_" + inputFieldId;
    inputBox.id = newInputBoxId;
    var parent = inputBox.parentNode;

    var link = document.createElement('A');
    link.href = "javascript:void(0);";
    link.id = lookupId + "_button";

    parent.appendChild(link);

    var hiddenDiv = document.createElement("DIV");
    hiddenDiv.id = lookupId;
    hiddenDiv.css = "{display: none;}";
    hiddenDiv.title = "";

    parent.appendChild(hiddenDiv);

    // createAjax autocomplete
    if (ajaxUrl != "" && showDescription != "") {
         SHOW_DESCRIPTION = showDescription;
        //write the new input box id in the ajaxUrl Array
        ajaxUrl = ajaxUrl.replace(ajaxUrl.substring(0, ajaxUrl.indexOf(",")), newInputBoxId);
        new ajaxAutoCompleter(ajaxUrl, showDescription, defaultMinLength, defaultDelay, formName);
    }
    
    var positioning = null;
    if (position == "topleft") {
        positioning = ['left', 'top'];
    } else if (position == "topcenter") {
        positioning = ['center', 'top'];
    } else if (position == "topright") {
        positioning = ['right', 'top'];
    } else if (position == "center") {
        positioning = 'center';
    } else if (position == "left") {
        positioning = 'left';
    } else if (position == "right") {
        positioning = 'right';
    } else {
        positioning = ['left', 'top'];
    }
    
    var lookupFormAction = null;
    function lookup_onKeyEnter(event) {
        if (event.which == 13) {
            lookupFormAjaxRequest(lookupFormAction, "form_" + lookupId);
            return false;
        }
    }
    
    // Lookup Configuration
    var dialogOpts = {
        modal: (modal == "true") ? true : false,
        bgiframe: true,
        autoOpen: false,
        height: (height != "") ? parseInt(height) : 500,
        width: (width != "") ? parseInt(width) : 620,
        position: positioning,
        draggable: true,
        resizeable: true,
        open: function() {
            var requestUrlAndArgs = requestUrl;
            if (typeof args == "object" && jQuery.isArray(args)) {
                for (var i = 0; i < args.length; i++) {
                    requestUrlAndArgs += "&parm" + i + "=" + jQuery(args[i]).val();
                }
            }
            jQuery("#" + lookupId).load(requestUrlAndArgs, function(data){ 
                lookupFormAction = jQuery("#" + lookupId + " form:first").attr("action");
                modifySubmitButton(lookupId);
                jQuery("#" + lookupId).bind("keypress", lookup_onKeyEnter);
                // set up the window chaining
                // if the ACTIVATED_LOOKUP var is set there have to be more than one lookup,
                // before registrating the new lookup we store the id of the old lookup in the
                // preLookup variable of the new lookup object. I.e. lookup_1 calls lookup_8, the lookup_8
                // object need a reference to lookup_1, this reference is set here
                var prevLookup = null
                if (ACTIVATED_LOOKUP) {
                    prevLookup = GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP).lookupId;
                }
                identifyLookup(lookupId);
                
                if (prevLookup) {
                    GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP).prevLookup = prevLookup;
                }
            });
        },
        close: function() {
            jQuery("#" + lookupId).unbind("keypress", lookup_onKeyEnter);
            //when the window is closed the prev Lookup get the focus (if exists)
            if (ACTIVATED_LOOKUP) {
                var prevLookup = GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP).prevLookup;
            }
            if (prevLookup) {
                identifyLookup(prevLookup);
            } else {
                ACTIVATED_LOOKUP = null;
            }
        }

    };
    
    // init Dialog and register
    // create an object with all Lookup Informationes that are needed
    var dialogRef = jQuery("#" + lookupId).dialog(dialogOpts);
    
    //setting up global variabels, for external access
    this.inputBoxId = inputBox.id;
    this.lookupId = lookupId;
    this.formName = formName;
    this.target = null;
    this.presentation = presentation;
    if (dialogOptionalTarget != null) {
        this.target2 = null;
    }
    this.prevLookup = null;
    this.dialogRef = dialogRef;
    //write external settings in global window manager
    GLOBAL_LOOKUP_REF.setReference(lookupId, this);
    
    // bind click Event to Dialog button
    jQuery("#" + lookupId + "_button").click(
        function (){
            jQuery("#" + lookupId).dialog("open");
            jQuery("#" + lookupId).dialog(dialogOpts);
            GLOBAL_LOOKUP_REF.getReference(lookupId).target = jQuery(dialogTarget);
            if (dialogOptionalTarget != null) {
                //the target2 have to be set here, because the input field is not created before
                GLOBAL_LOOKUP_REF.getReference(lookupId).target2 = jQuery(dialogOptionalTarget);
            }
            return false;
        }
    );

    // close the dialog when clicking outside the dialog area
    jQuery(".ui-widget-overlay").live("click", function() {  
        if(!ACTIVATED_LOOKUP || lookupId==ACTIVATED_LOOKUP){
            jQuery("#" + lookupId).dialog("close");
        }
    });

}

function FieldLookupCounter() {
    this.refArr = {};

    this.setReference = function (key, ref) {
        //if key doesn't exist in the array and
        for (itm in this.refArr) {
            if (itm == key) {
                prefix = key.substring(0, key.indexOf("_"));
                key = prefix + "_" + key;
                this.refArr[""+ key + ""] = ref;
                return this.refArr[key];
            }
        }
        this.refArr[""+ key + ""] = ref;
        return this.refArr[key];
    };
    
    this.getReference = function (key) {
        // when key does not exist return null?
        return this.refArr[key] != null ? this.refArr[key] : null;
    };
    
    this.getLastReference = function () {
        return (this.countFields() -1) + "_lookupId";
    }
    
    this.createNextKey = function () {
        return this.countFields() + "_lookupId";       
    };
    
    this.countFields = function () {
        var count = 0;
        jQuery.each(this.refArr, function (itm) {count++;});
        return count;
    };
    
    this.removeReference = function (key) {
        // deletes the Array entry (doesn't effect the array length)
        delete this.refArr[key];
    };
    
};
var GLOBAL_LOOKUP_REF = new FieldLookupCounter;


/**
* returns true if a String is empty
* @param value - String value
* @return
*/
function isEmpty(value) {
    if (value == null || value == "") {
        return true;
    }
    return false;
}

function identifyLookup (newAl) {
    if (ACTIVATED_LOOKUP != newAl) { 
        ACTIVATED_LOOKUP = newAl;
    }
}

//global expand/col button var
var COLLAPSE = 1999;
function getNextCollapseSeq() {
    COLLAPSE++;
    return COLLAPSE;
}

//modify expande/collapse button
function modifyCollapseable(lookupDiv){
    if (!lookupDiv) {
        return;
    }
    var slTitleBars = jQuery("#" + lookupDiv + " .screenlet-title-bar");
    //jQuery("#" + lookupDiv + " li.expanded");

    jQuery.each(slTitleBars, function(i) {
        var slTitleBar = slTitleBars[i];
        var ul = slTitleBar.firstChild;
        if ((typeof ul) != 'object') {
            return true;
        }
        var childElements = ul.childNodes;

        for (j in childElements) {
            if (childElements[j].className == 'expanded' || childElements[j].className == 'collapsed') {
                break;
            }
        }

        getNextCollapseSeq();
        var childEle = childElements[j].firstChild;

        childEle.setAttribute('onclick', "javascript:toggleScreenlet(this, 'lec" + COLLAPSE +"', 'true', 'Expand', 'Collapse');");
        childEle.href = "javascript:void(0);"
        jQuery(slTitleBar).next('div').attr('id', 'lec' + COLLAPSE);

    });
}

function modifySubmitButton (lookupDiv) {
    /* changes form/submit behavior for Lookup Layer */
    if (lookupDiv) {
        modifyCollapseable(lookupDiv);

        //find the lookup form and input button
        var lookupForm = jQuery("#" + lookupDiv + " form:first");

        //set new form name and id
        oldFormName = lookupForm.attr("name");
        lookupForm.attr("name", "form_" + lookupDiv);
        lookupForm.attr("id", "form_" + lookupDiv);
        lookupForm = jQuery("#form_" + lookupDiv);
        //set new links for lookups
        var newLookups = jQuery("#" + lookupDiv + " .field-lookup");

        var formAction = lookupForm.attr("action");
        // remove the form action
        lookupForm.attr("action", "");
        var input = jQuery("#" + lookupDiv + " input[type=submit]").css({display: "block"});

        // remove the original input button and replace with a new one

        var txt = input.attr("value");
        (input.parent()).append(jQuery("<button/>", {
            id: "lookupSubmitButton",
            href: "javascript:void(0);",
            click: function () {
                lookupFormAjaxRequest(formAction, lookupForm.attr("id"));
                return false;
            },
            text: txt
        }));

        input.remove();
        //modify nav-pager
        var navPagers = jQuery("#" + lookupDiv + " .nav-pager a");
        jQuery.each(navPagers, function(navPager) {
            jQuery(navPagers[navPager]).attr("href", "javascript:lookupPaginationAjaxRequest('" + encodeURI(jQuery(navPagers[navPager]).attr("href")) + "','link')");
        });

        var navPagersSelect = jQuery("#" + lookupDiv + " .nav-pager select");
        jQuery.each(navPagersSelect, function(navPager) {
            // that's quite weird maybe someone have a better idea ... that's where the magic happens
            try {
                  var oc = jQuery(navPagersSelect[navPager]).attr("onchange");
                  if((typeof oc) == "function"){ // IE6/7 Fix
                    oc = oc.toString();
                    var ocSub = oc.substring((oc.indexOf('=') + 3),(oc.length - 4));
                    // define search pattern we must seperate between IE and Other Browser
                    var searchPattern = /" \+ this.value \+ "/g;
                    var searchPattern_IE = /'\+this.value\+'/g;
                    var searchPattern2 = /" \+ this.valu/g;
                    var searchPattern2_IE = /'\+this.valu/g;

                    if (searchPattern.test(ocSub)) {
                        var viewSize = navPagersSelect[navPager].value;
                        var spl = ocSub.split(searchPattern);
                        navPagersSelect[navPager].onchange = function () {
                            lookupPaginationAjaxRequest(spl[0] + this.value + spl[1],'select');
                        };
                    } else if (searchPattern_IE.test(ocSub)) {
                        var viewSize = navPagersSelect[navPager].value;
                        var spl = ocSub.split(searchPattern_IE);
                        navPagersSelect[navPager].onchange = function () {
                            lookupPaginationAjaxRequest("/" + spl[0] + this.value + spl[1],'select');
                        };
                    } else if (searchPattern2.test(ocSub)) {
                        ocSub = ocSub.replace(searchPattern2, "");
                        if (searchPattern.test(ocSub)) {
                            ocSub.replace(searchPattern, viewSize);
                        }
                        navPagersSelect[navPager].onchange = function () {
                            lookupPaginationAjaxRequest(ocSub + this.value,'select');
                        };
                    } else if (searchPattern2_IE.test(ocSub)) {
                        ocSub = ocSub.replace(searchPattern2_IE, "");
                        if (searchPattern_IE.test(ocSub)) {
                            ocSub.replace(searchPattern_IE, viewSize);
                        }
                        navPagersSelect[navPager].onchange = function () {
                            lookupPaginationAjaxRequest("/" + ocSub + this.value,'select');
                        };
                    }
                } else {
                    var ocSub = oc.substring((oc.indexOf('=') + 1),(oc.length - 1));
                    navPagersSelect[navPager].setAttribute("onchange", "lookupPaginationAjaxRequest(" + ocSub + ",'')");
                }

                if (resultTable == null) {
                    return;
                }
                resultTable = resultTable.childElements()[0];
                var resultElements = resultTable.childElements();
                for (i in resultElements) {
                    var childElements = resultElements[i].childElements();
                    if (childElements.size() == 1) {
                        continue;
                    }
                    for (k = 1; k < childElements.size(); k++) {
                        var cell = childElements[k];
                        var cellChild = null;
                        cellChild = cell.childElements();
                        if (cellChild.size() > 0) {
                            for (l in cellChild) {
                                var cellElement = cellChild[l];
                                if (cellElement.tagName == 'A') {
                                    var link = cellElement.href;
                                    var liSub = link.substring(link.lastIndexOf('/')+1,(link.length));
                                    if (liSub.indexOf("javascript:set_") != -1) {
                                        cellElement.href = link;
                                    } else {
                                        cellElement.href = "javascript:lookupAjaxRequest('" + liSub + "&presentation=layer')";
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (ex) {
            }
        });
        // modify links in result table ...
        var resultTable= jQuery("#" + lookupDiv + " #search-results table:first tbody");
        var tableChildren = resultTable.children();
        jQuery.each(tableChildren, function(tableChild){
            var childElements = jQuery(tableChildren[tableChild]);
            var tableRow = childElements.children();
            jQuery.each(tableRow, function(cell){
                var cellChild = null;
                cellChild = jQuery(tableRow[cell]).children();
                jQuery.each(cellChild, function (child) {
                    if (cellChild[child].tagName == "A"){
                        var link = cellChild[child].href;
                        var liSub = link.substring(link.lastIndexOf('/')+1,(link.length));
                        if (liSub.indexOf("javascript:set_") != -1) {
                            cellChild[child].href = link;
                        } else {
                            cellChild[child].href = "javascript:lookupAjaxRequest('" + liSub + "&presentation=layer')";
                        }
                    }
                });

            });

        });
    }
}
/**
 * Create an ajax Request
 */
function lookupAjaxRequest(request) {
    // get request arguments
    var arg = request.substring(request.indexOf('?')+1,(request.length));
    request = request.substring(0, request.indexOf('?'));
    lookupId = GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP).lookupId;
    jQuery("#" + lookupId).load(request, arg, function(data) {
        modifySubmitButton(lookupId);
    });
}

/**
* Create an ajax request to get the search results
* @param formAction - action target
* @param form - formId
* @return
*/
function lookupFormAjaxRequest(formAction, form) {
    lookupId = GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP).lookupId;
    var data = jQuery("#" + form).serialize();
    data = data + "&presentation=" + GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP).presentation;
    jQuery("#" + lookupId).load(formAction, data, function(data) {
        modifySubmitButton(lookupId);
    });
}

function lookupPaginationAjaxRequest(navAction, type) {
    lookupDiv = (GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP).divRef);
    lookupContent = (GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP).contentRef);

    lookupId = GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP).lookupId;
    jQuery("#" + lookupId).load(navAction, function(data) {
        modifySubmitButton(lookupId);
    });
}

/*******************************************************************************************************
* This code inserts the value lookedup by a popup window back into the associated form element
*******************************************************************************************************/
var re_id = new RegExp('id=(\\d+)');
var num_id = (re_id.exec(String(window.location))? new Number(RegExp.$1): 0);
var obj_caller = (window.opener? window.opener.lookups[num_id]: null);
if (obj_caller == null && window.opener != null) {
    obj_caller = window.opener;
} else if (obj_caller == null && window.opener == null) {
    obj_caller = parent;
}

function setSourceColor(src) {
    if (target && target != null) {
        src.css("background-color", "yellow");
    }
}
// function passing selected value to calling window, using only in the TimeDuration case
function set_duration_value (value) {
    if(GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP)){
        obj_caller.target = GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP).target;
    }
    else {
        obj_caller.target = jQuery(obj_caller.targetW);
    }    
    var target = obj_caller.target;

    write_value(value, target);
    closeLookup();
}
// function passing selected value to calling window
function set_value (value) {
    if(GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP)){
        obj_caller.target = GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP).target;
    }
    else {
        obj_caller.target = jQuery(obj_caller.targetW);
    }
    
    var target = obj_caller.target;
    write_value(value, target);

    closeLookup();
}
// function passing selected value to calling window
function set_values (value, value2) {
    if(GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP)){
        obj_caller.target = GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP).target;
        obj_caller.target2 = GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP).target2;
    }
    else {
        obj_caller.target = jQuery(obj_caller.targetW);        
    }
    var target = obj_caller.target;
    var target2 = obj_caller.target2;
    write_value(value, target);
    write_value(value2, target2)
    if (SHOW_DESCRIPTION) setLookDescription(target.attr("id"), value + " " + value2, "", "", SHOW_DESCRIPTION);
    
    closeLookup();
}

function write_value (value, target) {
    if (target && target != null) {
        setSourceColor(target);
        target.val(value);
        target.trigger("lookup:changed");
    }    
}

function set_multivalues(value) {
    obj_caller.target.value = value;
    field = jQuery("#" + target.attr('id')); // TODO: Not tested (should be ok)we need to fix 1st the window lookup (see OFBIZ-3933)
    field.trigger("lookup:changed"); //  If we decide to keep it (only used in Example, though it's needed also for Themes and Languages but not the same way)
    if (field.change != null) {
        field.click().change()
    }

    var thisForm = obj_caller.target.form;
    var evalString = "";
    
    if (arguments.length > 2) {
        for (var i = 1; i < arguments.length; i = i + 2) {
            evalString = "setSourceColor(thisForm." + arguments[i] + ")";
            eval(evalString);
            evalString = "thisForm." + arguments[i] + ".value='" + arguments[i + 1] + "'";
            eval(evalString);
        }
    }
    closeLookup();
}

//close the window after passing the value
function closeLookup() {
    if (window.opener != null && GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP) == null) {
        window.close();
    } else {
        obj = GLOBAL_LOOKUP_REF.getReference(ACTIVATED_LOOKUP).lookupId;
        jQuery("#" + obj).dialog("close");
    }
}

//load description for lookup fields 
var lookupDescriptionLoaded = function(fieldId, url, params, formName) {
  this.init(fieldId, url, params, formName);
}
lookupDescriptionLoaded.prototype.init = function (fieldId, url, params, formName) {
  this.fieldId = fieldId;
  this.url = url;
  this.params = params;
  this.formName = formName;
}
lookupDescriptionLoaded.prototype.update = function (){
  var tooltipElement = jQuery("#" + this.fieldId + '_lookupDescription');
  if (tooltipElement.length) {//first remove current description
    tooltipElement.remove();
  }
  //actual server call
  var fieldName = this.params.substring(this.params.indexOf("searchValueFieldName"));
  fieldName = fieldName.substring(fieldName.indexOf("=") + 1);
  var fieldSerialized = jQuery("input[name=" + fieldName + "]", jQuery("form[name=" + this.formName + "]")).serialize();
  this.allParams = this.params + '&' + fieldSerialized + '&' + 'searchType=EQUALS';
  _fieldId = this.fieldId;
  
  jQuery.ajax({
    url: this.url,
    type: "POST",
    data: this.allParams,
    async: false,
    success: function(result){
      // This would be far more reliable if we were removing the widget boundaries in LookupDecorator using widgetVerbose in context :/
      if (result.split("ajaxAutocompleteOptions.ftl -->")[1]) {
        setLookDescription(_fieldId, result.split("ajaxAutocompleteOptions.ftl -->")[1].trim().split("<!--")[0].trim(), "", "");
      }
    }
  });
}
    
if(typeof String.prototype.trim !== 'function') { // Needed because IE8 does not implement trim yet
  String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, ''); 
  }
}
