/*************************** START SUPPORT FUNCTIONS ***************************/
function produceState(target, store, value) {
    jQuery(target).data(store, value);
}

function consumeState(target, store) {
    var value = jQuery(target).data(store);
    jQuery(target).removeData(store);    
    return value;
}
/**************************** END SUPPORT FUNCTIONS ****************************/


/**************************** START EVENT FUNCTIONS ****************************/

/***************************** END ENABLE/DISABLE ******************************/
function jimEnableDisableItem(args) {
    if (args.target !== undefined && args.value !== undefined) {
        var $target = jQuery(args.target);
        if (args.value) {
            $target.removeAttr("disabled").css("cursor", "default");
        } else {
            $target.attr("disabled", "disabled").css("cursor", "default");
        }
    }  
}

function jimEnableDisableList(args) {
    if (args.target !== undefined && args.value !== undefined) {
        var $target = jQuery(args.target);
        if (args.value) {
            $target.removeAttr("disabled"); 
        } else {
            $target.attr("disabled", "disabled");
        }
        var $inputList = $target.find('input');
        if ($inputList.length > 0) {
           $inputList.each(function() {
               if (args.value) {
                   jQuery(this).removeAttr("disabled").css("cursor", "default");
               } else {
                   jQuery(this).attr("disabled", "disabled").css("cursor", "default");
               }
           });
        }
    }    
}

function jimEnableDisable(args) {
    if (args.target !== undefined && args.value !== undefined) {        
        var $target = jQuery(args.target);
        var enable = args.value;
        
        var hoveroutAction = consumeState(args.target, "hoveroutaction_enable");
        if (hoveroutAction === undefined) {             /* simple event or hover mouseenter */
            if (args.checkHoverState === true) {        /* hover mouseenter: store hover mouseleave action */
                hoveroutAction = ($target.attr("disabled") === "disabled" || $target.attr("disabled") === true) ? false : true;
                produceState(args.target, "hoveroutaction_enable", hoveroutAction);  
            }
        } else {                                        /* hover mouseleave or event in-between */
            if(args.checkHoverState === undefined) {    /* has state, but it's not a hover mouseleave -> event is in-between */
               produceState(args.target, "hoveroutaction_enable", enable);
            } else {                                    /* asign hover mouseleave action */ 
                enable = hoveroutAction;
            }
        }         
        
        args.value = enable;
        args.typeAction.call(this,args);
    }
}
/***************************** END ENABLE/DISABLE *****************************/


/***************************** START SET FOCUS ON *****************************/
function jimFocusOn(args) {
    var targetOffset = jQuery(args.target).offset();
    jQuery.scrollTo(".content", {top: targetOffset.top, left: targetOffset.left}, 1100);
}
/******************************* END SET FOCUS ON ******************************/


/********************************* START STYLE *********************************/
function backupStyle(target, eventStyle) {
    var $target = jQuery(target);
    var styleBackup = {};
    for (cssKey in eventStyle) {
        if (eventStyle.hasOwnProperty(cssKey)) {
            styleBackup[cssKey] = $target.css(cssKey);
        }
    }
    produceState(target, "hover_style", styleBackup);           
}

function addStyle(target, eventStyle) {
    if (target !== undefined && eventStyle !== undefined) {
        jQuery(target).css(eventStyle);
    }
}

function addStyleWithState(target, eventStyle, overwrite) {    
    if (target !== undefined && eventStyle !== undefined && overwrite !== undefined) {
        if(overwrite) {
            addStyle(target, eventStyle);
            backupStyle(target, eventStyle);
        } else {
            backupStyle(target, eventStyle);
            addStyle(target, eventStyle);
        }
    }
}

function addLayoutFixStyle(layoutFix) {
    var $layoutFixInner = jQuery(layoutFix + "_inner");
    if ($layoutFixInner.length !== 0) {
        backupStyle(layoutFix + "_inner", {"width":$layoutFixInner.css("width")});        
        var maxwidth = 0;
        jQuery(layoutFix + "_inner" + " > *").each( function() {
            maxwidth = Math.max(jQuery(this).width(), maxwidth);
        });
        $layoutFixInner.width(maxwidth);
    }
    
    var $layoutFixMiddle = jQuery(layoutFix + "_middle");        
    if ($layoutFixMiddle.length !== 0) {
        backupStyle(layoutFix + "_middle", {"height":$layoutFixMiddle.css("height")});
        var maxheight = 0;
        jQuery(layoutFix + "_middle" + " > *").each( function() {
            maxheight = Math.max(jQuery(this).height(), maxheight);
        });
        $layoutFixMiddle.height(maxheight);
    }        
}

function removeStyle(target) {
    if (target !== undefined) {
        var styleState = consumeState(target, "hover_style");
        if (styleState !== undefined || styleState !== null || styleState !== "") {
            jQuery(target).css(styleState);
        }
    }    
}

function jimChangeStyle(args) {
    if (args.target !== undefined) {
        
        if ($.browser.msie) {
            if (args.itemEventStyleHack !== undefined) {
                args.itemEventStyle = $.extend({}, args.itemEventStyle, args.itemEventStyleHack);
            }
            if (args.wrappingEventStyleHack !== undefined) {
                args.wrappingEventStyle = $.extend({}, args.wrappingEventStyle, args.wrappingEventStyleHack);
            }
        }

        var styleState = consumeState(args.target, "hover_style");
        if (styleState === undefined) {                 /* simple event or hover mouseenter */
            if (args.checkHoverState === true) {        /* hover mouseenter: store hover mouseleave action */
                addStyleWithState(args.target, args.itemEventStyle, false);
                if (args.specialStyleTarget !== undefined) {
                    addStyleWithState(args.specialStyleTarget, args.itemEventStyle, false);
                }
                addStyleWithState(args.wrappingTarget, args.wrappingEventStyle, false);
                /* special style cases so far only dropdown -> no dimensions for options holder*/
                if (args.specialStyleWrappingTarget !== undefined) {
                    delete args.wrappingEventStyle.height;
                    delete args.wrappingEventStyle.width;
                    addStyleWithState(args.specialStyleWrappingTarget, args.wrappingEventStyle, false);
                }
                if (args.layoutFix !== undefined) {
                    addLayoutFixStyle(args.layoutFix);
                }
            } else {
                addStyle(args.target, args.itemEventStyle);
                addStyle(args.specialStyleTarget, args.itemEventStyle);
                addStyle(args.wrappingTarget, args.wrappingEventStyle);
                /* special style cases so far only dropdown -> no dimensions for options holder*/
                if (args.specialStyleWrappingTarget !== undefined) {
                    delete args.wrappingEventStyle.height;
                    delete args.wrappingEventStyle.width;
                    jQuery(args.specialStyleWrappingTarget).css(args.wrappingEventStyle);
                }
                if (args.layoutFix !== undefined) {
                    addLayoutFixStyle(args.layoutFix);
                }
            }
        } else {                                        /* hover mouseleave or event in-between */
            if(args.checkHoverState === undefined) {    /* has state, but it's not a hover mouseleave -> event is in-between */
                addStyleWithState(args.target, args.itemEventStyle, true);
                if (args.specialStyleTarget !== undefined) {
                    addStyleWithState(args.specialStyleTarget, args.itemEventStyle, true);
                }
                addStyleWithState(args.wrappingTarget, args.wrappingEventStyle, true);
                /* special style cases so far only dropdown -> no dimensions for options holder*/
                if (args.specialStyleWrappingTarget !== undefined) {
                    delete args.wrappingEventStyle.height;
                    delete args.wrappingEventStyle.width;
                    addStyleWithState(args.specialStyleWrappingTarget, args.wrappingEventStyle, true);
                }
                if (args.layoutFix !== undefined) {
                    addLayoutFixStyle(args.layoutFix);
                }
            } else {                                    /* asign hover mouseleave action */
                produceState(args.target, "hover_style", styleState); // re-insert style
                removeStyle(args.target);
                removeStyle(args.specialStyleTarget);
                removeStyle(args.wrappingTarget);
                removeStyle(args.specialStyleWrappingTarget);
                if (args.layoutFix !== undefined) {
                    removeStyle(args.layoutFix + "_inner");
                    removeStyle(args.layoutFix + "_middle");
                }
            }
        }
    }  
}
/********************************** END STYLE **********************************/


/****************************** START NAVIGATION *******************************/
function jimLinkToTarget(args) {
    if(args.target !== undefined) {
        if (args.target.lastIndexOf("http://") != -1 || args.popup) {
            if(args.popup){
                args.target = "../other/PrototypeLayout.do?ac=" + args.target;
            }
            loadNewPageOld(args.target, args.popup, args.width, args.height, args.center, args.top, args.left, args.scroll, args.resizable, args.menubar, args.toolbar, args.statusbar, args.location);
        } else {
            $.historyLoad(args.target, args.popup, args.width, args.height, args.center, args.top , args.left, args.scroll, args.resizable, args.menubar, args.toolbar, args.statusbar, args.location);
        }
    }
}

function jimLinkToWithSubmit(args) {
    if (args.submit !== undefined) {
        if (!args.submit) {     
            jimLinkToTarget(args);
        } else {
            var formid = null;
            if(args.parentFormID !== undefined) {
                formid = args.parentFormID;
            }
            if(args.listadoID === undefined) {
                submitButtonPressed(args.target, args.popup, formid, args.width, args.height, args.center, args.top, args.left, args.scroll, args.resizable, args.menubar, args.toolbar, args.statusbar, args.location);
            } else {
                var paginationEvent = args.paginationEventType;
                if (paginationEvent !== undefined) {
                    /* get pageparameter and pagenumber from listing's pagination, e.g p=2 */
                    var $pei = jQuery(args.listadoID).find("div#paginationeventinfo");
                    loadNewPageListing($pei.attr("pageparam") + "=" + $pei.attr(paginationEvent)); 
                } else {
                    /* submit events in list must also submit the row object id */
                    submitButtonPressedInList(args.target, jQuery(args.srcElement).parents('td.listColumn').parent().find('input:hidden#boCode').val(), args.listadoID, args.popup, formid, args.width, args.height, args.center, args.top, args.left, args.scroll, args.resizable, args.menubar, args.toolbar, args.statusbar, args.location);
                }
            }
        }
    }   
}

function jimLinkToTargetHtml(args) {
    if(args.target !== undefined) {
        loadNewPageOld(args.target, args.popup, args.width, args.height, args.center, args.top, args.left, args.scroll, args.resizable, args.menubar, args.toolbar, args.statusbar, args.location);
    }
}

function jimLinkToDecision(args) {
    jQuery('.CommentPanel').each(function(){jQuery(this).show();});
    $.jGrowl(jQuery(args.sourceDecisionID).html(), {beforeOpen: function(){jQuery(this).addClass('jGrowldecision');}, close: function() {jQuery(this).data('jGrowl.instance').shutdown(); jQuery(this).remove();}, theme: 'decision', position: 'center', sticky: true, closer: false});
}

/******************************** END NAVIGATION *******************************/


/******************************* START SHOW/HIDE *******************************/
function jimHideShow(args) {
    if (args.target !== undefined && args.value !== undefined) {        
        var $target = jQuery(args.target);
        var hide = args.value;
        
        var hoveroutAction = consumeState(args.target, "hoveroutaction_showhide");
        if (hoveroutAction === undefined) {             /* simple event or hover mouseenter */
            if (args.checkHoverState === true) {        /* hover mouseenter: store hover mouseleave action */
                hoveroutAction = jQuery(args.target+":hidden").size() !== 0 ? true : false;
                produceState(args.target, "hoveroutaction_showhide", hoveroutAction);  
            }
        } else {                                        /* hover mouseleave or event in-between */
            if(args.checkHoverState === undefined) {    /* has state, but it's not a hover mouseleave -> event is in-between */
               produceState(args.target, "hoveroutaction_showhide", hide);
            } else {                                    /* asign hover mouseleave action */ 
                hide = hoveroutAction;
            }
        }
        
        if (hide) {
            $target.hide();
        } else {
            $target.show();
        }
    }
}

function jimHideShowTab(args) {
    if (args.target !== undefined && args.value !== undefined && args.parentTabID !== undefined) {        
        var $target = jQuery(args.target);
        var $parentTab = jQuery(args.parentTabID);
        var $visibleTab = $parentTab.children("div:visible");
                
        var hoveroutTarget = consumeState(args.parentTabID, "hoverout_tab");
        if (hoveroutTarget === undefined) {             /*  simple event or hover mouseenter */
            if (args.checkHoverState === true) {        /* hover mouseenter: store hover mouseleave target */
                produceState(args.parentTabID, "hoverout_tab", "#"+$visibleTab.attr('id'));
            }
        } else {                                        /* hover mouseleave or event in-between */
            if(args.checkHoverState === undefined) {    /* has state, but it's not a hover mouseleave -> event is in-between */
               produceState(args.parentTabID, "hoverout_tab", args.target);
            } else {                                    /* asign hover mouseleave target */ 
                $target = jQuery(hoveroutTarget);
            }
        }
        
        $visibleTab.hide();
        $target.show();
    }
}
/******************************** END SHOW/HIDE ********************************/


/**************************** START SET/UNSET VALUE ****************************/
function jimSetValueText(args) {
    if (args.target !== undefined && args.value !== undefined && args.value !== "null") {        
        var $target = jQuery(args.target);
        var value = args.value;
                
        var hoveroutValue = consumeState(args.target, "hoverout_value");
        if (hoveroutValue === undefined) {              /* simple event or hover mouseenter */
            if (args.checkHoverState === true) {        /* hover mouseenter: store hover mouseleave value */
                 hoveroutValue = ($target.attr("tagName") === "INPUT") ? $target.val() : $target.html();
                 produceState(args.target, "hoverout_value", hoveroutValue);  
            }
        } else {                                        /* hover mouseleave or event in-between */
            if(args.checkHoverState === undefined) {    /* has state, but it's not a hover mouseleave -> event is in-between */
               produceState(args.target, "hoverout_value", value);
            } else {                                    /* asign hover mouseleave value */ 
               value = hoveroutValue; 
            }
        }
        
        if($target.attr("tagName") === "INPUT") {
            $target.val(value);
        } else {
            $target.html(value);    
        }        
    }
}

function applyValueForCheckBox(args) {
    var $target = jQuery(args.target);
    if (args.value == "true") {
        $target.attr("checked", true);
    } else {
        $target.attr("checked", false);
    }
}

function applyValueForRadioButtonList(args) {
    var $target = jQuery(args.target);
    var breakCheck = false;
    $target.find("input").each(function() {
        if(breakCheck === false && args.value.indexOf(jQuery(this).next().html()) !== -1) {
            this.checked = true;
            breakCheck = true;
        } else {
            this.checked = false;
        }
    });
}

function applyValueForCheckBoxList(args) {
    var $target = jQuery(args.target);
    $target.find("input").each(function() {
        if(args.value.indexOf(jQuery(this).next().html()) !== -1) {
            this.checked = true;
        } else {
            this.checked = false;
        }
    });
}

function jimSetValueWithClone(args) {
    if (args.target !== undefined && args.value !== undefined && args.value !== "null") {
        var $target = jQuery(args.target);
        
        var hoveroutValue = consumeState(args.target, "hoverout_value");
        if (hoveroutValue === undefined) {                  /* simple event or hover mouseenter */
            if (args.checkHoverState === true) {            /* hover mouseenter: store hover mouseleave value */
                produceState(args.target, "hoverout_value", $target.clone(true));
            }
            args.typeAction.call(this,args);                /* apply values */
        } else {                                            /* hover mouseleave or event in-between */
            if(args.checkHoverState === undefined) {        /* has state, but it's not a hover mouseleave -> event is in-between */
                args.typeAction.call(this,args);            /* apply values */
                produceState(args.target, "hoverout_value", $target.clone(true));
            } else {                                        /* asign hover mouseleave value */ 
                $target.replaceWith(hoveroutValue);
            }
        }        
    }
}

function produceSetValueHoverStateForMultiSelectBox(target) {
    var $target = jQuery(target);
    if($target.attr("tagName") === "DIV") {                         
        $target = jQuery("select"+target+"-multiselectbox");
    }
    var hoveroutValue = {};
    $target.find("option").each(function(index) {
        hoveroutValue[index] = this.selected;
    }); 
    produceState(target, "hoverout_value", hoveroutValue);
}

function applyValueForMultiSelectBox(args) {
    var $target = jQuery(args.target);
    if($target.attr("tagName") === "DIV") {                         /* handle multiselectbox alternative */
        var $options = jQuery("select"+args.target+"-multiselectbox").find('option');
        $target.find(".option").each(function(index) {
            if(this.innerHTML == args.value) {
                jQuery(this).addClass('active');
                $options.get(index).selected = true;
            } else {
                jQuery(this).removeClass('active');
                $options.get(index).selected = false;
            }
        });
    } else {                                                        /* handle single multiselectbox */
        $target.find("option").each(function(index) {
            if(jQuery(this).html() == args.value) {
                this.selected = true;
            } else {
                this.selected = false;
            }
        });         
    }   
}

function jimSetValueMultiSelectBox(args) {
    if (args.target !== undefined && args.value !== undefined && args.value !== "null") {
        var $target = jQuery(args.target);
        
        var hoveroutValue = consumeState(args.target, "hoverout_value");
        if (hoveroutValue === undefined) {                  /* simple event or hover mouseenter*/
            if (args.checkHoverState === true) {            /* hover mouseenter: store hover mouseleave value */
                produceSetValueHoverStateForMultiSelectBox(args.target);
            }
            args.typeAction.call(this,args);                /* apply values */
        } else {                                            /* hover mouseleave or event in-between */
            if(args.checkHoverState === undefined) {        /* has state, but it's not a hover mouseleave -> event is in-between */
                args.typeAction.call(this,args);            /* apply values */
                produceSetValueHoverStateForMultiSelectBox(args.target);
            } else {                                        /* asign hover mouseleave value */ 
                if($target.attr("tagName") === "DIV") {     /* handle multiselectbox alternative */
                    $target.find(".option").each(function(index) {
                        if(hoveroutValue[index]) {
                            jQuery(this).addClass('active');
                        } else {
                            jQuery(this).removeClass('active');
                        }
                    });
                    jQuery("select"+args.target+"-multiselectbox").find('option').each(function(index) {
                        this.selected = hoveroutValue[index];
                    });
                } else {                                    /* handle single multiselectbox or dropdown */
                    $target.find("option").each(function(index) {
                        this.selected = hoveroutValue[index];
                    });                 
                }
            }
        }        
    }
}
    
function applyValueForDropDown(args) {
    var $options = jQuery(args.target + "_options").children(".option");
    var breakCheck = false;
    $options.each(function() {
        if(breakCheck === false && jQuery(this).text() == args.value) {
            jQuery(this).trigger("autoload.click");
            breakCheck = true;
        }
    });     
}

function jimSetValueDropDown(args) {
    if (args.target !== undefined && args.value !== undefined && args.value !== "null") {
        var $target = jQuery(args.target);
        
        var hoveroutValue = consumeState(args.target, "hoverout_value");
        if (hoveroutValue === undefined) {                  /* simple event or hover mouseenter */
            if (args.checkHoverState === true) {            /* hover mouseenter: store hover mouseleave value */
                hoveroutValue = $target.text();
                produceState(args.target, "hoverout_value", hoveroutValue);
            }
            args.typeAction.call(this,args);                /* apply values */
        } else {                                            /* hover mouseleave or event in-between */
            if(args.checkHoverState === undefined) {        /* has state, but it's not a hover mouseleave -> event is in-between */
                args.typeAction.call(this,args);            /* apply values */
                hoveroutValue = $target.text();
                produceState(args.target, "hoverout_value", hoveroutValue);
            } else {                                        /* asign hover mouseleave value */ 
                args.value = hoveroutValue;
                args.typeAction.call(this,args);
            }
        }        
    }
}
/***************************** END SET/UNSET VALUE *****************************/

/***************************** END EVENT FUNCTIONS *****************************/


/******************** GENERAL ENTRYPOINT TO EVENT FUNCTIONS ********************/
function launchEvent(eventObject, event) {
    if (jQuery("input#commentmode_checkbox").attr("checked") === true && event.type === "click") {
        $.commentsystem.dialog.addComment(event);
    } else {
        eventObject.action.call(this,eventObject.parameter);
    }
}