
jQuery.isJson = function(str) {
    if (jQuery.trim(str) == '') return false;
    str = str.replace(/\\./g, '@');
    str = str.replace(/"[^"\\\n\r]*"/g, '');
    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
}

var common = {

    isDocumentModified: '',
    isClickToggleCheckbox: false,

    settings: {},

    ovDebug: function(message, alert) {
        return;
        var debugMode = false;
        if (global.dm == true || debugMode) var debugMode = true;
        if (debugMode)   return window.console && common.ovDebug && console.log(message);
    },

    init: function(){
        common.getScript(global.i18nUrl);
        common.getScript('/js/ovModalBox.js');
        common.getScript('/js/libs/utils/jquery.cookie.js', 'cookie');

        if (typeof global == "undefined") {
            alert('GLOBAL IS NOT DEFINED');
            return;
        }

        /* Load cookies*/

        this.shootInitables();
        this.shootLiveInitables();
    },


    shootLiveInitables: function() {

        /* Prevent Clicks on inactive links */
        $('a.ov-inactive').bind('click', function(e) {
            e.preventDefault();
            return false;
        });

        /**
         * delete target element
         */
        $('a.ovDeleteTarget').live('click', function(e){
            e.preventDefault();
            $($(this).attr('href')).css('background-color', '#FFF79A ').fadeOut(200, function(){
                $(this).remove();
            });
        });

        $('a.ajaxToTarget').live('click', common.ajaxToTarget);

        ovModalBox.init();

    },

    shootInitables: function() {
        /*Shoot first to allow time for creation */
        this.initDropdownButtons();
        this.initDropdownSelectCheckbox();
        this.initTooltipLink();
        this.initTooltipHelpLink();
        this.initAutoCompleteComboBox();

        /* Fire Tabs */
        var tabs = $('.tabs');
        if (tabs.length) {
            common.ovTabs();
            $(".tabs-vertical").addClass('ov-tabs-vertical ui-helper-clearfix');
            $(".tabs-vertical li").removeClass('ui-corner-top').addClass('ui-corner-left');

            /* Make sure tabs do not trigger modalBox (unless specificaly indicated) */
            tabs.find('ul.ui-tabs-nav a').addClass('noModalBox');
        }

        /* IMPORTANT: initToggleElement will also shoot this.blurDefaultValue() */
        this.initToggleElement();
        this.initRowClickable();
        this.initShowActivity();

    },

    getParameter: function(name) {

        name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
        var regexS = "[\\?&]" + name + "=([^&#]*)";
        var regex = new RegExp(regexS);
        var results = regex.exec(window.location.href);
        if(results == null)
            return "";
        else
            return decodeURIComponent(results[1].replace(/\+/g, " "));
    },


    minBrowserVersion: function(version, warning) {
        var version = version || 8;
        if ($.browser.msie  && parseInt($.browser.version) < version) {
            if (warning) {
                common.ovFlashMessage('Important: Some advanced features may not be available unless you upgrade to a modern browser like Firefox or Chrome.', 'error');
            }
            return false;
        }
        else return true;
    },


    jumpToUrl: function (url) {
        if (url != "") {
            window.top.location.href = url;
        }
    },

    quantityField: function() {

        $('input.ov-quantity').each(function() {
            $(this).after('<span class="ov-increase"></span><span class="ov-decrease"></span>');
            $(this).parent().css('padding-right', '20px');

            var selectUnitSymbol = $(this).parent().find('select.ov-unit-symbol');
            if(selectUnitSymbol.length > 0) {
                selectUnitSymbol.css('margin-left', '30px');
            }
        })
        $(".ov-increase").click(function()
        {
            var inputField = $(this).prev('input');
            var currentVal = parseInt(inputField.val());
            if (currentVal != NaN)
            {
                inputField.val(currentVal + 1).trigger('change');
            }
        }).disableSelection();

        $(".ov-decrease").click(function()
        {
            var inputField = $(this).prev().prev('input');
            var currentVal = parseInt(inputField.val());
            if (currentVal != NaN && currentVal > 0)
            {
                inputField.val(currentVal - 1).trigger('change');
            }
        }).disableSelection();

    },


    /**
     * check if flash player is installed
     */
    hasFlashPlayer: function(){
        return true;
    },

    getMaxZindex: function(obj) {
        //

        //var maxZ = Math.max.apply(null,$.map(obj.parentsUntil('c'), function(e,n){
        //     element = $(e);
        //      if(element.css('position')=='absolute' && element.css('z-index') != "auto") {
        //          return parseInt($(e).css('z-index'))||1 ;
        //      }
        //
        //      })
        //    );

        //var maxZ = Math.max.apply(null,$.map($('#'+self.name, top.document).find('body > *'), function(e,n){
        //      if($(e).css('position')=='absolute')
        //           return parseInt($(e).css('z-index'))||1 ;
        //      })
        //    );
        var maxZ = 1000;
        if (obj instanceof jQuery) {

            obj.parents().each(function(){
                var element = $(this);
                var z = element.css('z-index');
                var position = element.css('position');
                if((position == 'absolute' || position == 'relative' || position == 'fixed')  && element.css('z-index') != "auto") {
                    if (parseInt(z) > maxZ) maxZ =  parseInt(z);
                }

            });

        }


        return(Math.max(maxZ, 1000));
    },

    /**
     * get height of a dom element or full document
     */
    getHeight: function(selector) {
        if (selector) {
            return document.getElementById(selector).offsetHeight;
        }
        var D = document;
        return Math.max(
            Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
            Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
            Math.max(D.body.clientHeight, D.documentElement.clientHeight)
            );

    },


    ovPreview: function(){
        xOffset = 10;
        yOffset = 30;
        $("a.ov-preview").hover(function(e){
            var link = $(this);
            var url = (link.hasClass('ov-preview-alt') ? link.attr('alt') : this.href);
            this.t = (this.title != 'undefined' ? this.title : '');
            this.title = "";
            var c = (this.t != "") ? "<br/>" + this.t : "";
            $("body").append("<p id='ov-image-preview' class='ov-corner-all'><img src='"+ url +"' alt='Image preview' />"+ c +"</p>");
            $("#ov-image-preview")
            .css("top",(e.pageY - xOffset) + "px")
            .css("left",(e.pageX + yOffset) + "px")
            .fadeIn("fast");
        },
        function(){
            this.title = this.t;
            $("#ov-image-preview").remove();
        });
        $("a.ov-preview").mousemove(function(e){
            $("#ov-image-preview")
            .css("top",(e.pageY - xOffset) + "px")
            .css("left",(e.pageX + yOffset) + "px");
        });
    },



    initColorManagement : function() {

        function RGBToHex(rgb) {
            var chars = "0123456789ABCDEF";
            return String(chars.charAt(Math.floor(rgb / 16))) + String(chars.charAt(rgb - (Math.floor(rgb / 16) * 16)));
        }

        function cutHex(hex) {
            return (hex.charAt(0)=="#") ? hex.substring(1,7):hex
        }
        function HexToR(hex) {
            return parseInt((cutHex(hex)).substring(0,2),16)
        }
        function HexToG(hex) {
            return parseInt((cutHex(hex)).substring(2,4),16)
        }
        function HexToB(hex) {
            return parseInt((cutHex(hex)).substring(4,6),16)
        }

        function findContrastedColor(hexColor) {
            R = HexToR(color);
            G = HexToG(color);
            B = HexToB(color);
            common.ovDebug('colors '+R+' '+G+' '+B);
            var contrast = (  (R * 299) + (G * 587) + (B * 114)  ) / 1000;
            var contrastedColor = '#000000';
            if (contrast < 128) contrastedColor = '#FFFFFF';
            return contrastedColor;
        }
    },
    //Google style highlighting
    initHighlighting : function() {
        var google_text_color = '#000000';
        var google_link_colors = new Array('#ffff66','#a0ffff','#99ff99','#ff9999','#ff66ff');

        function init_google(){
            var pattern = /google\./i;
            if (pattern.exec(document.referrer) != null){
                var url_parts = document.referrer.split('?');
                if (url_parts[1]){
                    var url_args = url_parts[1].split('&');
                    for(var i=0; i<url_args.length; i++){
                        var keyval = url_args[i].split('=');
                        if (keyval[0] == 'q'){
                            go_google(decode_url(keyval[1]));
                            return;
                        }
                    }
                }
            }
        }

        function decode_url(url){
            return unescape(url.replace(/\+/g,' '));
        }

        function go_google(terms){
            terms = terms.replace(/\"/g,"");
            var terms_split = terms.split(' ');
            var c = 0;
            for(var i=0; i<terms_split.length; i++){
                highlight_goolge(terms_split[i], document.body,google_link_colors[c]);
                c = (c == google_link_colors.length-1)?0:c+1;
            }
        }

        function highlight_google(term, container, color){
            var term_low = term.toLowerCase();

            for(var i=0; i<container.childNodes.length; i++){
                var node = container.childNodes[i];

                if (node.nodeType == 3){
                    var data = node.data;
                    var data_low = data.toLowerCase();
                    if (data_low.indexOf(term_low) != -1){
                        //term found!
                        var new_node = document.createElement('SPAN');

                        node.parentNode.replaceChild(new_node,node);

                        var result;
                        while((result = data_low.indexOf(term_low)) != -1){
                            new_node.appendChild(document.createTextNode(
                                data.substr(0,result)));
                            new_node.appendChild(create_node_google(
                                document.createTextNode(data.substr(
                                    result,term.length)),color));
                            data = data.substr(result + term.length);
                            data_low = data_low.substr(result + term.length);
                        }
                        new_node.appendChild(document.createTextNode(data));
                    }
                }else{
                    //recurse
                    highlight_google(term, node, color);
                }
            }
        }

        function create_node_google(child, color){
            var node = document.createElement('SPAN');
            node.style.backgroundColor = color;
            node.style.color = google_text_color;
            node.appendChild(child);
            return node;
        }

    },




    /**
     * create a tabs group
     */
    ovTabs: function(selection) {

        //$('.tabs').tabs({ cookie: { expires: 1} });

        if(!selection) {
            selection = $('.tabs');
        }

        // to manage field's error in tabs group
        // each tabs group is walked, first tab in group with field's error is selected
        var tabs_elt = null;
        // find tabs group
        //        $('.tabs').each(function() {
        selection.each(function() {
            tabs_elt = $(this);
            tabs_elt.tabs();

            var tab_elt = null;
            /* Display tabs with errors */
            $(this).find('.ui-state-default').each(function(index) {
                // li contain class ov-tabs-open-first
                if(($(this).hasClass('ov-tabs-open-first') || $(this).find('.ov-tabs-open-first').length) && !tab_elt) {
                    // tab in tabs group selected
                    tabs_elt.tabs('select', index);
                    tab_elt = this;
                }
            });
            // find tabs in group
            $(this).find('.ui-tabs-panel').each(function(index) {
                // tab contain field' error
                if($(this).find('.row-error').length) {
                    if(!tab_elt) {
                        // tab in tabs group selected
                        tabs_elt.tabs('select', index);
                        tab_elt = this;
                    }
                }
            });

        });
    },


    /**
     * create a layer and append to body
     */

    ovDivCreate: function(id, zIndex, classes, content, prepend) {
        //if (!zIndex) zIndex = 1000;
        if ($('#'+id).length === 0) {
            common.ovDebug(id+' zindex: '+zIndex);
            var newDiv = $(document.createElement('div')).attr('id', id);
            if (classes) newDiv.attr('class', classes);
            if (zIndex) newDiv.css('z-index', zIndex);
            if (content) newDiv.html(content);

            if (prepend) {
                $('body').prepend(newDiv);
            }else {
                $('body').append(newDiv);
            }

        }
    },


    /**
     * create a blurable default value on fields
     */
    blurDefaultValue: function () {
        common.bindBlurDefaultValue();

        $('form.hasBlurableFields').submit( function(e) {
            var form = $(this);
            form.find('.blurDefaultValue').each(function() {
                var field = $(this);
                var defaultString = field.attr('title');
                if (field.val() == defaultString) {
                    field.val(''); //if (field.attr('id') == 'contact_party_ContactPartyAddresses_0_city') alert('BLUR DELETE')
                };
            });

            return true;
        });
    },

    bindBlurDefaultValue: function (selector) {
        var selector = selector || '.blurDefaultValue';
        $(selector).each(function() {
            var field = $(this);
            var defaultString = field.attr('title');
            if (defaultString && defaultString !== undefined) {
                field.bind('blur', function() {
                    var field = $(this);
                    var currentString = field.val()
                    if(!currentString || currentString == 'null' || currentString == 'undefined') {
                        field.css('color', '#CCC').val(defaultString);
                    }
                });

                field.bind('focus change', function() {
                    var field = $(this);
                    if(field.val() == defaultString) {
                        field.val('');
                    }
                    field.css('color', '')
                });

                /* make sure the defualt string gets deleted on form submit */
                field.parents('form').addClass('hasBlurableFields');

                field.trigger('blur');
            }
        })//.trigger('blur');

    },


    /**
     * Initialize flash message system
     */
    ovFlashMessageDisplayed: false,
    ovFlashMessageContainer: new Array(),

    ovFlashMessageCreate: function(zIndex) {
        //if (!zIndex) zIndex = 1002;

        common.ovDivCreate('ov-flash-message', zIndex);
    },





    ovFlashMessage: function(msgtext, type, sticky, zIndex, stack) {
        common.ovFlashMessageContainer.push({
            t: type,
            m: msgtext
        });


        common.ovFlashMessageCreate(zIndex);

        var flashContainer = $('#ov-flash-message');
        flashContainer.addClass('ov-corner-bottom');

        if(!common.ovFlashMessageDisplayed) {
            var container = common.ovFlashMessageContainer.shift();
            if(container) {
                show(container.m, container.t);
            }

            flashContainer.find('span.close').click(function() {
                flashContainer.fadeOut("slow", function(){
                    //do not remove otherwise we loose the zIndex initial setting
                    //$(this).remove();

                    next();
                });
            });
        }
        else {
            next();
        }

        function next() {
            var container = common.ovFlashMessageContainer.shift();
            if(container) {
                show(container.m, container.t);
            }
            else {
                common.ovFlashMessageDisplayed = false;
            }
        }

        function show(msgtext, type) {

            if(!msgtext) {
                return;
            }

            common.ovFlashMessageDisplayed = true;

            flashContainer.html('<span class="close">×</span><p><span></span>'+msgtext+'</p>');


            if (type) {
                flashContainer.removeClass('ov-flash-error ov-flash-info ov-flash-notice ov-flash-preview').addClass('ov-flash-'+type);
            }
            else if (flashContainer.hasClass()) {
                type = flashContainer.attr('class');
            }
            if (!type)  type = 'info';


            /* If preview, store CSS inline (to make sure it will appear) */
            if (type == 'preview') {
                flashContainer.css({
                    background: 'none repeat scroll 0 0 #555555',
                    border: 'thin solid orange',
                    display: 'inline',
                    fontSize: '13px',
                    maxWidth: '400px',
                    padding: 0
                })
            }

            flashContainer.fadeIn("slow");

            if (type != 'ov-flash-error' && !sticky) {
                setTimeout(function() {
                    flashContainer.fadeOut("slow", function() {
                        //do not remove otherwise we loose the zIndex initial setting
                        //$(this).remove();

                        next();
                    });
                }, 3000);
            }
        }
    },



    initToggleRegion: function() {
        /* Kill state fields unless US or Canada */
        var thereAreRegionsHere = false;
        $('select.updateRegion').bind( 'change', function() {
            countrySelect = $(this);
            var divId = countrySelect.attr('id');
            divId = divId.replace("country", "state");
            if ((countrySelect.val() != 'US') && (countrySelect.val() != 'CA')) {
                countrySelect.closest('div.row').prev('div.regionRow').hide();
            }
            else {
                countrySelect.closest('div.row').prev('div.regionRow').show();
            }

            var thereAreRegionsHere = true;
        });
        $('select.updateRegion') . trigger('change');
    },

    /**
     * functions are binded on events, in order to bind other function on events
     */
    initAutoCompleteComboBox: function() {

        $('.ov-combobox-processing').each(function() {

            if($(this).attr('autocomplete') == undefined) {
                $(this)
            .autocomplete()
            .bind('autocompletesearch', function(event, ui) {
                $(this).addClass('ov-input-processing');
            })
            .bind('autocompleteopen', function(event, ui) {
                $(this).removeClass('ov-input-processing');
            })
            .bind('autocompleteclose', function(event, ui){
                $(this).removeClass('ov-input-processing');
            })
        ;
            }
        });

        $('.ov-combobox').each(function() {

            if($(this).attr('autocomplete') == undefined) {
                
                $(this)
            .autocomplete()
            .bind('autocompletesearch', function(event, ui) {
                $(this).addClass('ov-input-processing');
            })
            .bind('autocompleteopen', function(event, ui) {
                $(this).removeClass('ov-input-processing');
                $(this).removeClass('ov-combobox-close');
                $(this).addClass('ov-combobox-open');
            })
            .bind('autocompleteclose', function(event, ui){
                $(this).removeClass('ov-input-processing');
                $(this).removeClass('ov-combobox-open');
                $(this).addClass('ov-combobox-close');
            })
                ;

                var button = $('<a id="button-' + $(this).attr('id') + '" href="#" class="ov-link-finder"></a>').bind('click', function(e) {
                    e.preventDefault();

                    var combobox = $(this).prev('input.ov-combobox');
                    if(combobox.hasClass('ov-combobox-close')) {

                        $('.ov-combobox').each(function() {
                            $(this).autocomplete('close');
                        });

                        combobox.trigger('focus');
                        combobox.autocomplete('search', combobox.val());
                    }
                    else {
                        combobox.autocomplete('close');
                    }
                });

                $(this).after(button);

                $(this).addClass('ov-combobox-close');
            }
        });
    },

    initDropdownButtons: function() {
        /* Init dropdownButtons */
        // USAGE :
        //    <ul id="" class="ovDropdownButtonContent"  rel="<img src='/images/icons/farm/add.png'> Select">
        //        <li><a href="urlA">Link A</a></li>
        //        <li><a href="urlB">Link B</a></li>
        //        <li><a href="urlC">Link C</a></li>
        //    </ul>
        $('.ovDropdownButtonContent, .ovDropdownButtonContentDual, .ovDropdownButtonContentLink').not("[class*=div-like-textarea]").each(function() {
            var content = $(this);
            var title = content.attr('rel') || 'Select';
            var id = content.attr('id') || 'ovDropdownButton_' + Math.floor(Math.random()*101);
            var containerClass = 'ovDropdownButton';
            if (id != "undefined") {
                content.attr('id', null);
            }

            if (content.hasClass('ovDropdownButtonContentDual')) {
                containerClass = 'ovDropdownButtonDual';
                content.removeClass('ovDropdownButtonContentDual').addClass('ovDropdownButtonContent');

                content.addClass('div-like-textarea').wrap('<span id="' + id + '" class="ovDropdownButtonContainer ' + containerClass + '" />')
                .after('<a href="javascript:void(0);" class="button ovDropdownButtonTitle submit-button">' + title + '</a><a href="javascript:void(0);" class="button ovDropdownButtonTarget ovDropdownButtonSelector">&nbsp;</a>');
            }
            else if (content.hasClass('ovDropdownButtonContentLink')) {
                containerClass = 'ovDropdownButtonDual';
                content.removeClass('ovDropdownButtonContentDual').addClass('ovDropdownButtonContent');

                content.addClass('div-like-textarea').wrap('<span id="' + id + '" class="ovDropdownButtonContainer ' + containerClass + '" />')
                .after('<a href="' + content.attr('rel') + '" class="button ovDropdownButtonTitle submit-button">' + content.attr('title') + '</a><a href="javascript:void(0);" class="button ovDropdownButtonTarget ovDropdownButtonSelector">&nbsp;</a>');
            }
            else {
                content.addClass('div-like-textarea').wrap('<span id="' + id + '" class="ovDropdownButtonContainer ' + containerClass + '" />')
                .after('<a href="javascript:void(0);" class="button ovDropdownButtonTarget">' + title + '</a>');
            }
        });
    },

    toggleDropdownButtonTarget: function(obj, forceClose) {

        // flag to indicate click on checkbox in toggle link
        if(common.isClickToggleCheckbox) {
            common.isClickToggleCheckbox = false;
            return;
        }

        var toggleLink = $(obj);
        if (toggleLink.hasClass('ovDropdownButtonSelector'))  {
            var toggleContent = toggleLink.prev().prev('ul');
        }
        else {
            var toggleContent = toggleLink.prev('ul');
        }

        var parentWidth = toggleContent.closest('.ovDropdownButtonContainer').width();

        toggleContent.css('min-width', (parentWidth - 10) + 'px');

        if (toggleContent.css('display') != 'none' || forceClose) {
            setTimeout(function() {
                toggleContent.css('display', 'none')
            }, 50);
        }
        else {
            toggleContent.css('display', 'inline');
            checked = true;
        }

    },


    initDropdownSelectCheckbox: function() {

        // without dropdown list
        $('.ovSelectCheckbox').each(function(){
            var content = $(this);
            var target = content.attr('rel');

            content.addClass('ovSelectCheckboxToggle').removeClass('ovSelectCheckbox');

            $(':checkbox[name^="' + target + '"]').bind('click', function(e){

                target = $(this).attr('name');
                var checkboxes = $(':checkbox[name="' + target + '"]').length;
                var checkboxes_checked = $('input[name="' + target + '"]:checked').length;

                var checkbox_target = $('input[rel="' + target.replace(/\[\]/, '') + '"].ovSelectCheckboxToggle');

                if(checkboxes_checked > 0) {
                    checkbox_target.prop('checked', true);
                }

                var checked = checkbox_target.prop('checked');
                if(checkboxes_checked < checkboxes && checked) {
                    checkbox_target.css('opacity', 0.6);
                }
                else {
                    checkbox_target.css('opacity', 1);
                }

                if(checkboxes_checked == 0 && checked) {
                    checkbox_target.css('opacity', 1).prop('checked', false);
                }
            });
        });

        $('.ovSelectCheckboxToggle').bind('click', function(e){
            var target = $(this).attr('rel');
            var checked = $(this).prop('checked');

            $(this).css('opacity', 1);
            $(':checkbox[name^="' + target + '"]').prop('checked', checked);
        });

        // with dropdown list
        $('.ovDropdownSelectCheckbox').each(function(){
            var content = $(this);
            var target = content.attr('rel');

            var html = '<span class="ovDropdownSelectCheckboxContainer ovDropdownSelectCheckboxButton">';
            html += '<ul class="ovDropdownSelectCheckboxContent div-like-textarea">';
            html += '<li><a href="#" class="ovDropdownSelectCheckboxNone" rel="' + target + '">' + i18n_none + '</a></li>';
            html += '<li><a href="#" class="ovDropdownSelectCheckboxAll" rel="' + target + '">' + i18n_all + '</a></li>';
            html += '<li><a href="#" class="ovDropdownSelectCheckboxAllPages" rel="' + target + '">' + i18n_all_pages + '</a></li>';
            html += '</ul>';
            html += '<a class="button ovDropdownSelectCheckboxTarget" href="#">';
            html += '<input type="checkbox" class="ovDropdownSelectCheckboxToggle" rel="' + target + '">';
            html += '</a>';
            html += '</span>';
            html += '<input type="hidden" name="select_all_pages" id="select_checkbox_all_pages" value="" />';

            content.replaceWith(html);

            $(':checkbox[name^="' + target + '"]').bind('click', function(e){

                $('#select_checkbox_all_pages').val('');

                target = $(this).attr('name');

                var checkboxes = $(':checkbox[name="' + target + '"]').length;
                var checkboxes_checked = $('input[name="' + target + '"]:checked').length;

                var checkbox_target = $('input[rel="' + target.replace(/\[\]/, '') + '"].ovDropdownSelectCheckboxToggle');

                if(checkboxes_checked > 0) {
                    checkbox_target.prop('checked', true);
                }

                var checked = checkbox_target.prop('checked');
                if(checkboxes_checked < checkboxes && checked) {
                    checkbox_target.css('opacity', 0.6);
                }
                else {
                    checkbox_target.css('opacity', 1);
                }

                if(checkboxes_checked == 0 && checked) {
                    checkbox_target.css('opacity', 1).prop('checked', false);
                }

                var totalElts = -1;

                var input_total = checkbox_target.closest('.ovDropdownSelectCheckboxContainer').parent().find('input[name="total"]');
                var input_all_pages = checkbox_target.closest('.ovDropdownSelectCheckboxContainer').parent().find('input#select_checkbox_all_pages');

                if(input_total.length > 0) {
                    totalElts = parseInt(input_total.val());
                }

                var value = checked && totalElts == checkboxes_checked ? '1' : '';
                input_all_pages.val(value);
            });
        });

        $('.ovDropdownSelectCheckboxToggle').bind('click', function(e){
            // flag to indicate click on checkbox in toggle link
            common.isClickToggleCheckbox = true;

            var target = $(this).attr('rel');
            var checked = $(this).prop('checked');

            $(this).css('opacity', 1);
            var checkboxes_checked = $(':checkbox[name^="' + target + '"]').prop('checked', checked).length;

            var totalElts = -1;

            var input_total = $(this).closest('.ovDropdownSelectCheckboxContainer').parent().find('input[name="total"]');
            var input_all_pages = $(this).closest('.ovDropdownSelectCheckboxContainer').parent().find('input#select_checkbox_all_pages');

            if(input_total.length > 0) {
                totalElts = parseInt(input_total.val());
            }

            var value = checked && totalElts == checkboxes_checked ? '1' : '';
            input_all_pages.val(value);
        });

        $('.ovDropdownSelectCheckboxNone').bind('click', function(e){
            var target = $(this).attr('rel');
            $('.ovDropdownSelectCheckboxToggle').css('opacity', 1).prop('checked', false);
            $(':checkbox[name^="' + target + '"]').prop('checked', false);
            $('#select_checkbox_all_pages').val('');
        });

        $('.ovDropdownSelectCheckboxAll').bind('click', function(e){
            var target = $(this).attr('rel');
            $('.ovDropdownSelectCheckboxToggle').css('opacity', 1).prop('checked', true);
            $(':checkbox[name^="' + target + '"]').prop('checked', true);
            $('#select_checkbox_all_pages').val('');
        });

        $('.ovDropdownSelectCheckboxAllPages').bind('click', function(e){
            var target = $(this).attr('rel');
            $('.ovDropdownSelectCheckboxToggle').css('opacity', 1).prop('checked', true);
            $(':checkbox[name^="' + target + '"]').prop('checked', true);
            $('#select_checkbox_all_pages').val('1');
        });
    },

    /*
     *Show fields title in a nicely skined tooltip
     **/
    initTooltipTitles: function (params) {
        var selector = ':input[title]:not(.alreadyShot)';
        if(params && params.selector) {
            selector = params.selector;
        }        
        
        $(selector).addClass('alreadyShot').tooltip({
            tipClass: 'ov-tooltip-title',
            events: {
                input: 'focus mouseenter, blur mouseleave' 
            },
            position: 'bottom center',
            predelay: 50
        });           
    },

    /**
     * At this time, call in common.init() function
     * maybe call directly with params like link class, tooltip class, ...
     */
    initTooltipLink: function(params) {
        var selector = '.ov-tooltip-link:not(.alreadyShot)';
        if(params && params.selector) {
            selector = params.selector;
        }
        var elts = $(selector).addClass('alreadyShot');
        if (elts) {

            common.getScript('/js/libs/jquery-tools/jquery.tools.min.js', 'jquery.tools');

            elts.each(function(){

                var position = 'top right';
                var classes = $(this).attr('class').split(' ');
                for(var i in classes) {
                    var c = classes[i];
                    if(c.indexOf('ov-tooltip-position') != -1) {
                        position = c.replace(/ov-tooltip-position-/, '').replace(/-/, ' ');
                    } 
                }

                var effect = null;

                var dyn = {
                    bottom: {}
                };

                var tipClass = $(this).attr('rel') || 'ov-tooltip';

                $(this).tooltip({
                    //                    effect: 'fade',
                    position: position,
                    relative: true,
                    tipClass: tipClass
                });
                $(this).dynamic(dyn);

                /* close tooltip on click WHY the fusk did they not implement that ? */
                var tooltip = $(this).next('.' + tipClass);
                if(tooltip.length > 0) {
                    tooltip.find('a').each(function() {
                        $(this).bind('click', function(e) {
                            tooltip.hide();
                        });
                    });
                }
            });

            /* */
            elts.bind('click', function(e) {
                var href = $(this).attr('href');
                if(href == '' || href == '#') {
                    e.preventDefault();
                }
            });
        }

    },
    
    initTooltipHelpLink: function(params) {
        var selector = 'a.ov-tooltip-help-link:not(.alreadyShot)';
        if(params && params.selector) {
            selector = params.selector;
        }        
        
        var tipClass = $(this).attr('rel') || 'ov-tooltip-help';
  
        var helpLinks = $(selector);
        
        helpLinks.addClass('alreadyShot').tooltip({
            tipClass: tipClass,
            events: {
                def: 'click,blur' 
            },
            relative: true,
            position: 'center right'
        });
 
        
        helpLinks.bind('click', function(e) {
            e.preventDefault();
//            var tooltip = $(this).next('.' + tipClass);
//            if (tooltip.is(":visible")) { 
//                tooltip.hide();
//            }
            return false;
        });
   
    },    

    toggleTargetDown: function(clearFieldsOnHide, contentSelector) {
        /* Make sure all linkTargets to this content are synced */
        var allToggleLinks = $('a[href='+contentSelector+'], [alt='+contentSelector+']');

        var toggleContent = $(contentSelector);

        if(toggleContent.length == 0) {
            return;
        }

        if (clearFieldsOnHide || toggleContent.hasClass('clearFieldsOnHide')) {
            clearFieldsOnHide = true;
        }


        var openOnLoad = $.cookie('ov.' + global.ownerId + '.openOnLoad') || '';
        var strForCookie = new RegExp(','+contentSelector, 'g');
        openOnLoad = openOnLoad.replace(strForCookie,'');

        /* Show Content*/
        if (toggleContent.hasClass('ovToggleContentInline')) {
            toggleContent.css('display', 'inline');
        }else {

            toggleContent.slideDown('fast');
        }

        if (toggleContent.hasClass('ovCookies')) {
            $.cookie('ov.' + global.ownerId + '.openOnLoad', openOnLoad + ',' + contentSelector);
        }
        else {
            $.cookie('ov.' + global.ownerId + '.openOnLoad', null);
        }

        /* Aplly class change to all target links to this content*/
        allToggleLinks.each(function() {
            var tLink = $(this);
            if (tLink.hasClass('ov-show-more') || tLink.hasClass('ov-show-less')) {
                tLink.addClass('ov-show-less').removeClass('ov-show-more');
            }
        });
        if (clearFieldsOnHide) {
            toggleContent.find(':input').val('').blur();
        }

        /* advertise state */
        toggleContent.triggerHandler('toggle_opened');
    },

    toggleTargetUp: function(clearFieldsOnHide, contentSelector) {

        /* Make sure all linkTargets to this content are synced */
        var allToggleLinks = $('a[href='+contentSelector+'], [alt='+contentSelector+']');

        var toggleContent = $(contentSelector);

        if(toggleContent.length == 0) {
            return;
        }

        if (clearFieldsOnHide || toggleContent.hasClass('clearFieldsOnHide')) {
            clearFieldsOnHide = true;
        }


        var openOnLoad = $.cookie('ov.' + global.ownerId + '.openOnLoad') || '';
        var strForCookie = new RegExp(','+contentSelector, 'g');
        openOnLoad = openOnLoad.replace(strForCookie,'');

        /* Hide Content (also take care of Inline display */
        if (toggleContent.hasClass('ovToggleContentInline')) {
            toggleContent.css('display', 'none');
        }else {
            toggleContent.slideUp('fast');
        }
        if (toggleContent.hasClass('ovCookies')) {
            $.cookie('ov.' + global.ownerId + '.openOnLoad', openOnLoad);
        }
        else {
            $.cookie('ov.' + global.ownerId + '.openOnLoad', null);
        }

        /* Aplly class change to all target links to this content*/
        allToggleLinks.each(function() {
            var tLink = $(this);
            if (tLink.hasClass('ov-show-more') || tLink.hasClass('ov-show-less')) {
                tLink.addClass('ov-show-more').removeClass('ov-show-less');
            }
        });

        if (clearFieldsOnHide) {
            toggleContent.find(':input').val('').blur();
        }

        /* advertise state */
        toggleContent.triggerHandler('toggle_closed');

    },


    toggleAllTargetUp: function(toggleTarget) {

        var targetContentSelector = null;
        //        var targetTag = toggleTarget.nodeName.toLowerCase();
        var targetTag = $(toggleTarget).prop('tagName').toLowerCase();
        if (targetTag == 'a') {
            targetContentSelector = $(toggleTarget).attr('href');
        }
        else {
            targetContentSelector = $(toggleTarget).attr('alt');
        }

        $('[rel^="' + $(toggleTarget).attr('rel') + '"]').each(function() {

            var contentSelector = null;
            var tag = $(this).prop('tagName').toLowerCase();
            if (tag == 'a') {
                contentSelector = $(this).attr('href');
            }
            else {
                contentSelector = $(this).attr('alt');
            }

            if(contentSelector) {
                common.toggleTargetUp(false, contentSelector);
            }

        });
    },

    /* Toggle corresponding container, also ensures that the +/- icon is properly sync and keep the status in cookie if applicable */
    toggleTarget: function(e, clearFieldsOnHide, contentSelector, toggleTarget){
        if(!toggleTarget) {
            toggleTarget = this;
        }
        
        var toggleTargetLink = $(toggleTarget);

        if(!contentSelector) {
            var tag = toggleTargetLink.prop('tagName').toLowerCase();
            if (tag == 'a') {
                e.preventDefault();
                contentSelector = toggleTargetLink.attr('href');
            }
            else {
                contentSelector = toggleTargetLink.attr('alt');
            }
        }

        /* Hide all contents */
        common.toggleAllTargetUp(toggleTarget);


        var toggleContent = $(contentSelector);
        

        /* Hide Content*/
        if (toggleContent.is(":visible")) {

            common.toggleTargetUp(clearFieldsOnHide, contentSelector);
        }

        /* Show Content*/
        else  {

            common.toggleTargetDown(clearFieldsOnHide, contentSelector);


            /* if hide trigger link */ 
            if (toggleTargetLink.hasClass('hideTrigger')) {
                toggleTargetLink.hide();
            }
            /* if hide trigger link row */ 
            if (toggleTargetLink.hasClass('hideTriggerRow')) {
                toggleTargetLink.closest('.row').hide();
            }            


        }
 

    },

    toggleTargetClear: function(e, initialState) {
        common.toggleTarget(e, true);
    },


    /* Delete a form row "virtually" so that it can be deleted on save */
    deleteRow: function (e) {
        e.preventDefault();
        var deleteLink = $(this);
        var row = deleteLink.closest('div.row');
        if (row && row != 'undefined' && confirm(i18n_are_you_sure)) {
            row.hide().find(':input').each(function(){
                if($(this).attr('name').search('delete') != -1) {
                    $(this).val('1');
                }
            });
        }
    },

    /* TODO: terminer cette fonction Toggle Delete a form row "virtually" so that it can be deleted on save but still appears for user */
    toggleDeleteRow: function (e) {
        e.preventDefault();
        var deleteLink = $(this);
        var row = deleteLink.closest('div.row');
        if (row && row != 'undefined') {
            if (row.hasClass('to-delete')) {
                row.css('opacity', 1);
                row.removeClass('to-delete row-error');
                row.find(':input').prop('disabled', false);
            }
            else if(confirm(i18n_are_you_sure)) {
                row.addClass('to-delete');
                row.css('opacity', 0.3);
                row.find(':input').prop('disabled', true);
            }

            row.find(':input').each(function(){
                if($(this).attr('name').search('delete') != -1) {
                    $(this).val(deleteValue);
                }
            });
        }
    },

    /* Toggle a new form row  */
    toggleDeleteNewRow: function (e) {
        e.preventDefault();
        var link = $(this);
        if (link.hasClass('add-record')) {
            var recordType = $(this).attr('alt');

            var parent = $(this).closest('.add-under-field');
            var newLine = parent.prevUntil('.field').length;

            var node = $('#' + recordType).clone(true);

            node.attr('id', node.attr('id').replace('_0', '_' + newLine).replace('_new', ''));
            node.removeClass('add-' + recordType + ' new-row-hidden');
            node.addClass('new-row-displayed');

            node.find('div').each(function() {
                if(id = $(this).attr('id')) {
                    id.replace('_new', '');
                    id.replace('_0', '_' + newLine);
                    $(this).attr('id', id);
                }
            });
            node.find('*').each(function() {
                if ($(this).attr('id')) {
                    $(this).attr('id', $(this).attr('id').replace('_0', '_' + newLine).replace('_new', ''));
                } 
                
                if ($(this).attr('name')) {
                    $(this).attr('name', $(this).attr('name').replace('[0]', '[' + newLine + ']').replace('_new', '').replace('new', ''));
                } 
                
                if ($(this).attr('href')) {
                    $(this).attr('href', $(this).attr('href').replace('_0', '_' + newLine).replace('_new', ''));
                }                 
            });

            node.insertBefore(parent);
            
            /* re-shoot bind events */
            link.triggerHandler('newRowAdded');
            

        }
        else {
            var row = link.closest('div.row');
            if (row && row != 'undefined') {
                if (row.hasClass('new-row-displayed')) {
                    row.addClass('new-row-hidden').removeClass('new-row-displayed').find(':input').val('').blur();
                }
                else {
                    row.addClass('new-row-hidden').removeClass('new-row-displayed');
                }
            }
        }
    },




    /**
 * Initialize toggle element system
 */
    initToggleElement: function(){
        $('a.toggle').unbind('click').bind('click', function(e){
            e.preventDefault();
            var toggleLink = $(this);
            if (toggleLink.hasClass('ov-show-more') || toggleLink.hasClass('ov-show-less')) {
                toggleLink.toggleClass('ov-show-more');
                toggleLink.toggleClass('ov-show-less');
            }
            var selector = (toggleLink.closest('.row').length) ? toggleLink.closest('.row').next('.ovToggleContent') : toggleLink.next('.ovToggleContent');
            if (selector.css('display') == 'none') {
                var propertyValueForShow = 'block';
                /* if inline content */
                if (toggleLink.hasClass('ovToggleContentInline')) {
                    propertyValueForShow = 'inline';
                }
                selector.css('display', propertyValueForShow);
                selector.find(':input[type!="submit"][type!="hidden"]').val('');
            } else {
                selector.hide();
            }

        });

        /* Toggle tabs within a tab menu or ul */
        $('a.ovToggleTabs').unbind('click').bind('click', function(e){
            e.preventDefault();
            var toggleLink = $(this);

            $('.ovToggleContentTabs').hide();

            $(toggleLink.attr('href')).show();
        });

        /* bind a tag */
        /* Toggle a div with options, for example just bellow the toggle link (+ / -) */
        $('a.ovToggleTarget').unbind('click').bind('click', common.toggleTarget);


        /* bind input:checkbox tag */
        /* Toggle a div on checkbox change */
        $('input:checkbox.ovToggleTarget').unbind('click').bind('click', common.toggleTarget);

        /* Toogle delete row links */
        $('.toggleDeleteRow').unbind('click').bind('click', common.toggleDeleteRow);
        $('.deleteRow').unbind('click').bind('click', common.deleteRow);
        $('.toggleDeleteNewRow').unbind('click').bind('click', common.toggleDeleteNewRow);

        /* Trigger all blurable fields*/
        this.blurDefaultValue();


        /* Hide all togle-contents (exept if there are errors) */
        $('.ovToggleContent').not('.ovOpenOnLoad, .alreadyShot').addClass('alreadyShot').hide();


        /* Shoot initial states has set in cookies */
        var  openOnLoad = $.cookie('ov.' + global.ownerId + '.openOnLoad') || '';
        openOnLoad = openOnLoad.split(",");
        if (openOnLoad) {
            for (var i in openOnLoad) {
                var contentSelector = openOnLoad[i];
                common.toggleContainerProcessShow(contentSelector) ;
            }
        }

        /* Shoot initial states has set in dom with ovOpenOnLoad */
        $('.ovOpenOnLoad').parents('.ov-show-more').addClass('ov-show-less').removeClass('ov-show-more');


        /* Make sure toggle containers with errors inside are opened */
        $('.error_list').each(function() {
            var toggleContainer = $(this).parents('.ovToggleContent');
            if (toggleContainer.length) {
                common.toggleContainerProcessShow(toggleContainer) ;
            };
        });

        /* Bind DropDownButtons - IMPORTANT: do it last otherwise button will not be initiated by Jquery yet */
        $('.ovDropdownButtonTarget, .ovDropdownSelectCheckboxTarget').unbind('click').bind('click', function(e) {
            //            e.preventDefault();
            common.toggleDropdownButtonTarget(this)
        })
        .unbind('blur').bind('blur', function() {
            var targetLink = $(this);

            setTimeout(function() {
                common.toggleDropdownButtonTarget(targetLink, true)

            }, 200);
        });


    },

    /* Handle toggle containers show/hide with proper CSS display property and sync +/- icons on the toggle links */
    toggleContainerProcessShow: function (contentSelector) {
        if (contentSelector && contentSelector !='' && contentSelector !='undefined') {
            var obj = $(contentSelector);
            if (obj.length) {
                var propertyValueForShow = 'block';
                if (obj.hasClass('ovToggleContentInline')) {
                    propertyValueForShow = 'inline';
                }
                obj.css('display', propertyValueForShow);
                /*IMPORTANT: there can be several targetLinks */
                var toggleContainerTriggerLinks = $('a[href='+contentSelector+'], [alt='+contentSelector+']');
                /* Aplly class change to all toggle trigger links to this content*/
                toggleContainerTriggerLinks.each(function() {
                    var tLink = $(this);
                    if (tLink.hasClass('ov-show-more') || tLink.hasClass('ov-show-less')) {
                        tLink.addClass('ov-show-less').removeClass('ov-show-more');
                    }
                });
            }
        }
    },


    /* Toggle form rows, depending on a select form value */
    toggleFormRow: function(elementClass, defaultValue, selectorObject, isInitialTrigger){

        var selectedTypeId =  selectorObject.val();
        var selected = false;

        $('.'+elementClass).each(function (i) {

            var object = $(this);

            if (object.attr('id') == selectedTypeId) {
                object.closest('div[class*=row]').show();
                selected = true;
                if (!isInitialTrigger) {
                //object.effect("highlight", {}, 3000);
                }
            }
            else {
                object.closest('div[class*=row]').hide();
                object.val('');
            }
        });

        if (!selected) {
            $('#'+defaultValue).closest('div[class*=row]').show();
            selectorObject.val(defaultValue);
        }
    },



    ovCheckbox: function() {


        $('input.ov-checkbox').each(function(index){
            var field = $(this);
            field.removeClass('ov-checkbox').hide();
            var buttons = $('<span class="ovCheckboxButton ' + (field.prop("checked") ? 'isOn' : 'isOff') + '"><span id="'+field.attr('id')+'-on"  rel="'+ field.attr('id') + '" class="ovCheckboxButtonOn  ov-corner-left ov-border">'+i18n_yes+'</span><span id="'+field.attr('id')+'-on"  rel="'+ field.attr('id') + '" class="ovCheckboxButtonOff ov-corner-right ov-border">'+i18n_no+'</span></span>');
            field.after(buttons);
        });

        $('.ovCheckboxButton span').bind('click', function(e) {
            e.preventDefault();
            var button = $(this);
            var field = $('input#'+button.attr('rel'));

            if (button.hasClass('ovCheckboxButtonOn')) {
                field.prop("checked", true);
                button.parents('.ovCheckboxButton').addClass('isOn').removeClass('isOff');
            } else {
                field.prop("checked", false);
                button.parents('.ovCheckboxButton').addClass('isOff').removeClass('isOn');
            }
            field.trigger('change');

        });
    },


    /*
 * Load a script if not already loaded
 **/
    getScript: function(src, varTest, cache) {
        if (!src || src == "undefined" || src === false || src === true) {
            return false;
        }

        if (!cache) {
            cache = true;
        }

        if (varTest && $.varTest) {
            return false;
        }
        if ($('script[src="'+ src +'"]').length) {
            return false;
        }
        if ($.browser.msie) {
            var script = $("<script>");
            script.attr({
                type: 'text/javascript',
                src: src
            });
            $("body").append( script );
            $('script[src="'+ src +'"]').clone().appendTo('body');
        }
        else {
            $.ajax({
                url: src,
                dataType: 'script',
                cache: false,
                async: false
            });
        }
    },

    getStylesheet: function(src, title) {
        if (!src || $('link[rel="'+ src +'"]').length ) {
            return false;
        }


        if (document.createStyleSheet)
        {
            document.createStyleSheet(src);
        }
        else
        {
            $('<link rel="stylesheet" type="text/css" href="' + src + '" />').appendTo('head');
        }

        return;


        //common.includeFile(src);
        //return;

        var link = $("<link>");
        link.attr({
            type: 'text/css',
            rel: 'stylesheet',
            id: title || common.slugify(src),
            href: src
        }).appendTo('head');

        if ($.browser.msie) {
            $('link[rel="'+ src +'"]').clone().appendTo('head');
        }
    },


    includeFile: function(file) {
        var ext = file.substring(file.lastIndexOf('.')+1);


        switch (ext) {
            case 'js':
                var inc = document.createElement('script');
                inc.setAttribute('type','text/javascript');
                inc.setAttribute('src',file);
                break;
            case 'css':
                var inc = document.createElement('link');
                inc.setAttribute('type','text/css');
                inc.setAttribute('rel','stylesheet');
                inc.setAttribute('media','screen');
                inc.setAttribute('href',file);
                break;
        }
        document.getElementsByTagName('head').item(0).appendChild(inc);

    },




    initRowClickable : function() {
        $('.ov-clickable').unbind('click').bind('click', function (e) {
            if (!($(this).hasClass("action"))) {
                e.preventDefault();
                window.location =  $(this).attr('id');
            }
        });
        $('.row-clickable td').unbind('click').bind('click', function (e) {
            if (!($(this).hasClass("action"))) {
                e.preventDefault();
                window.location =  $(this).parent().attr('id');
            }
        });
    },



    addStyle : function(selector, options) {
        // Example: common.addStyle('div#ov-overlay').css('z-index', maxZindex+3+'!important');
        // NB : I CANT GET THIS TO WORK
        options = $.extend ({
            type: 'text/css',
            media: 'all'
        }, options);
        var style = $(document.createElement('style')).attr(options).appendTo('head')[0];
        if (style.styleSheet){
            // IE
            var sheet = style.styleSheet;
            sheet.addRule(selector, null);
            return $(sheet.rules[0]);
        }
        else if (style.sheet){
            // Firefox
            sheet = style.sheet;
            sheet.insertRule(selector+' {}',0);
            return $(sheet.cssRules[0]);
        }
    },


    setTextareaSize: function (selector) {
        if (!selector || selector == 'undefined') {
            var textareas = $('textarea');

        }

        else if ($('#'+selector).length) {
            var textarea = $('#'+selector);
            textarea.css('height', $(this).attr('scrollHeight')+'20px');
            return;
        }
        else if ($('.'+selector).length) {
            var textareas = $('.'+selector);
        }
        else return;


        textareas.each(function() {
            textarea = $(this);
            textarea.height(textarea.attr("scrollHeight"));
        });
    },


    ovAutoGrow : function(textareaClass) {


        //Make sure elFinder is loaded
        //if ($('script[src="/js/libs/utils/jquery.autogrow.js]').length === 0) {
        //load script
        //$.getScript('/js/libs/utils/jquery.autoresize.js');
        //}


        /* Find a better solution to shoot the autogrow */
        $('textarea.' + textareaClass).live('mousenter', function() {
            var textarea = $(this);
            textarea.css({
                'padding': '0',
                'min-height' : '500px'
            });
            common.setTextareaSize($(this).attr('id'));
            return;

            textarea.autoResize({
                // On resize:
                onResize : function() {
                    $(this).css({
                        opacity:0.9
                    });
                },
                // After resize:
                animateCallback : function() {
                    $(this).css({
                        opacity:1
                    });
                },
                // Quite slow animation:
                animateDuration : 300,
                // More extra space:
                extraSpace : 40
            });
        });
    },

    matchElemSize: function(elemModifyId, elemCopyId, forceMinHeight) {


        /* Make rightpane at least leftpane's size*/
        var elemCopy = document.getElementById(elemCopyId) || null;
        var elemModify = document.getElementById(elemModifyId) || null;
        var minHeight = forceMinHeight || null;
        var lh;
        if ( elemCopy &&  elemModify && (lh = elemCopy.offsetHeight)) {
            if ( minHeight && lh < minHeight) lh = minHeight;
            elemModify.style.minHeight = lh+'px';
        };
    },

    ovSaving: function() {
        common.ovDivCreate('ov-saving', 999999, 'ov-indicator', i18n_saving+'...');
        $('#ov-saving').show().fadeOut(1000);

        common.ovDebug('indicator hide');
    },


    initShowActivity: function() {
        $('.ovLoading').unbind('click').bind('click', function() {
            common.ovLoadingShow();
        });
    },

    ovLoadingCreate: function(zIndex) {
        if (!zIndex) zIndex = 1001;
        common.ovDivCreate('ov-loading', zIndex, 'ov-indicator', i18n_loading+'...');
    },


    ovLoadingShow: function() {
        common.ovLoadingCreate();

        $('#ov-loading').show();

        common.ovDebug('indicator show');
    },

    ovLoadingHide: function() {
        $('#ov-loading').hide();

        common.ovDebug('indicator hide');
    },


    ovErlayCreate: function(zIndex) {
        if (!zIndex) zIndex = 1001;
        common.ovDivCreate('ov-overlay', zIndex);
        $('#ov-overlay').html('<iframe src="/images/misc/clear-loader.gif"></iframe>')
    },

    ovErlayShow: function() {
        common.ovErlayCreate();

        $('#ov-overlay').show();
    },

    ovErlayHide: function() {
        $('#ov-overlay').hide();
    },

    urlExists: function(url) {

        var RegexUrl = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/

        //var RegexUrl = /^(http:\/\/www.|https:\/\/www.|ftp:\/\/www.|www.){1}([\w]+)(.[\w]+){1,2}$/;
        if (RegexUrl.test(url) != true) {
            return false;
        } else {
            return true;
        }

        // Sample use

        //alert(CheckValidUrl("http://www.example.com"));

        var request = false;
        if (window.XMLHttpRequest) {
            request = new XMLHttpRequest;
        }
        else if (window.ActiveXObject) {
            request = new ActiveXObject("Microsoft.XMLHttp");
        }

        if (request) {
            request.open("GET", url);
            if (request.status == 200) {
                return true;
            }
        }

        return false;
    },

    modificationsProtection: function(status) {


        if (status == 'setOn' && common.isDocumentModified === true)  {
            return true;
        }
        if (status == 'setOff' && common.isDocumentModified === false)  {
            return true;
        }

        if (status == 'setOn') {
            common.isDocumentModified  = true;
            common.ovDebug(' setOn isDocumentModified '+common.isDocumentModified);

            //            $('.save-button').css({
            //                'visibility' : 'visible',
            //                'opacity': 1
            //            }).effect("highlight", {}, 1000);

            /* Initate save confirmation on page exist */
            window.onbeforeunload = function() {
                if (common.isDocumentModified) return i18n_modification_will_be_lost;
            };
            return true;
        }
        else if (status == 'setOff') {
            common.isDocumentModified  = false;
            common.ovDebug(' setOff isDocumentModified '+common.isDocumentModified);
            //            $('.save-button').css({
            //                'visibility' : 'visible',
            //                'opacity': 0.2
            //            });
            return true;
        }

    },

    slugify: function(string)
    {
        if (!string) {
            return null;
        }


        var keys = keys || function (o) {
            var a = [];
            for (var k in o) a.push(k); return a;
        };
        //  var accents = "‚àö‚Ä†‚àö¬∞‚àö¬ß‚àö¬¢‚àö¬Æ‚àö¬©‚àö¬¥‚àö‚Ñ¢‚àö¬®‚àö‚â†‚àö√ò‚àö√Ü‚àö‚â§‚àö‚â•‚àö‚àÇ‚àö¬•‚àöœÄ‚àö‚à´‚àö¬∫‚àö¬™‚àö¬±‚àö√ü";
        var accents = "\u00e0\u00e1\u00e4\u00e2\u00e8"
        + "\u00e9\u00eb\u00ea\u00ec\u00ed\u00ef"
        + "\u00ee\u00f2\u00f3\u00f6\u00f4\u00f9"
        + "\u00fa\u00fc\u00fb\u00f1\u00e7";

        var without = "aaaaeeeeiiiioooouuuunc";

        var map = {
            '@': ' at ',
            '\u20ac': ' euro ',
            '$': ' dollar ',
            '\u00a5': ' yen ',
            '\u0026': ' and ',
            '\u00e6': 'ae',
            '\u0153': 'oe'
        };

        return string
        // Handle uppercase characters
        .toLowerCase()

        // Handle accentuated characters
        .replace(
            new RegExp('[' + accents + ']', 'g'),
            function (c) {
                return without.charAt(accents.indexOf(c));
            })

        // Handle special characters
        .replace(
            new RegExp('[' + keys(map).join('') + ']', 'g'),
            function (c) {
                return map[c];
            })

        // Dash special characters
        .replace(/[^a-z0-9]/g, '-')

        // Compress multiple dash
        .replace(/-+/g, '-')

        // Trim dashes
        .replace(/^-|-$/g, '');
    },

    base64Encode: function (str) {
        common.getScript('/js/libs/utils/jquery.base64.js', 'base64Encode');
        var encodedStr = $.base64Encode(str);

        return encodedStr;
    },

    defaultDiacriticsRemovalMap: [
    {
        'base':'A',
        'letters':/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g
    },

    {
        'base':'AA',
        'letters':/[\uA732]/g
    },

    {
        'base':'AE',
        'letters':/[\u00C6\u01FC\u01E2]/g
    },

    {
        'base':'AO',
        'letters':/[\uA734]/g
    },

    {
        'base':'AU',
        'letters':/[\uA736]/g
    },

    {
        'base':'AV',
        'letters':/[\uA738\uA73A]/g
    },

    {
        'base':'AY',
        'letters':/[\uA73C]/g
    },

    {
        'base':'B',
        'letters':/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g
    },

    {
        'base':'C',
        'letters':/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g
    },

    {
        'base':'D',
        'letters':/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g
    },

    {
        'base':'DZ',
        'letters':/[\u01F1\u01C4]/g
    },

    {
        'base':'Dz',
        'letters':/[\u01F2\u01C5]/g
    },

    {
        'base':'E',
        'letters':/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g
    },

    {
        'base':'F',
        'letters':/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g
    },

    {
        'base':'G',
        'letters':/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g
    },

    {
        'base':'H',
        'letters':/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g
    },

    {
        'base':'I',
        'letters':/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g
    },

    {
        'base':'J',
        'letters':/[\u004A\u24BF\uFF2A\u0134\u0248]/g
    },

    {
        'base':'K',
        'letters':/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g
    },

    {
        'base':'L',
        'letters':/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g
    },

    {
        'base':'LJ',
        'letters':/[\u01C7]/g
    },

    {
        'base':'Lj',
        'letters':/[\u01C8]/g
    },

    {
        'base':'M',
        'letters':/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g
    },

    {
        'base':'N',
        'letters':/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g
    },

    {
        'base':'NJ',
        'letters':/[\u01CA]/g
    },

    {
        'base':'Nj',
        'letters':/[\u01CB]/g
    },

    {
        'base':'O',
        'letters':/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g
    },

    {
        'base':'OI',
        'letters':/[\u01A2]/g
    },

    {
        'base':'OO',
        'letters':/[\uA74E]/g
    },

    {
        'base':'OU',
        'letters':/[\u0222]/g
    },

    {
        'base':'P',
        'letters':/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g
    },

    {
        'base':'Q',
        'letters':/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g
    },

    {
        'base':'R',
        'letters':/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g
    },

    {
        'base':'S',
        'letters':/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g
    },

    {
        'base':'T',
        'letters':/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g
    },

    {
        'base':'TZ',
        'letters':/[\uA728]/g
    },

    {
        'base':'U',
        'letters':/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g
    },

    {
        'base':'V',
        'letters':/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g
    },

    {
        'base':'VY',
        'letters':/[\uA760]/g
    },

    {
        'base':'W',
        'letters':/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g
    },

    {
        'base':'X',
        'letters':/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g
    },

    {
        'base':'Y',
        'letters':/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g
    },

    {
        'base':'Z',
        'letters':/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g
    },

    {
        'base':'a',
        'letters':/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g
    },

    {
        'base':'aa',
        'letters':/[\uA733]/g
    },

    {
        'base':'ae',
        'letters':/[\u00E6\u01FD\u01E3]/g
    },

    {
        'base':'ao',
        'letters':/[\uA735]/g
    },

    {
        'base':'au',
        'letters':/[\uA737]/g
    },

    {
        'base':'av',
        'letters':/[\uA739\uA73B]/g
    },

    {
        'base':'ay',
        'letters':/[\uA73D]/g
    },

    {
        'base':'b',
        'letters':/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g
    },

    {
        'base':'c',
        'letters':/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g
    },

    {
        'base':'d',
        'letters':/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g
    },

    {
        'base':'dz',
        'letters':/[\u01F3\u01C6]/g
    },

    {
        'base':'e',
        'letters':/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g
    },

    {
        'base':'f',
        'letters':/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g
    },

    {
        'base':'g',
        'letters':/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g
    },

    {
        'base':'h',
        'letters':/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g
    },

    {
        'base':'hv',
        'letters':/[\u0195]/g
    },

    {
        'base':'i',
        'letters':/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g
    },

    {
        'base':'j',
        'letters':/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g
    },

    {
        'base':'k',
        'letters':/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g
    },

    {
        'base':'l',
        'letters':/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g
    },

    {
        'base':'lj',
        'letters':/[\u01C9]/g
    },

    {
        'base':'m',
        'letters':/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g
    },

    {
        'base':'n',
        'letters':/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g
    },

    {
        'base':'nj',
        'letters':/[\u01CC]/g
    },

    {
        'base':'o',
        'letters':/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g
    },

    {
        'base':'oi',
        'letters':/[\u01A3]/g
    },

    {
        'base':'ou',
        'letters':/[\u0223]/g
    },

    {
        'base':'oo',
        'letters':/[\uA74F]/g
    },

    {
        'base':'p',
        'letters':/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g
    },

    {
        'base':'q',
        'letters':/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g
    },

    {
        'base':'r',
        'letters':/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g
    },

    {
        'base':'s',
        'letters':/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g
    },

    {
        'base':'t',
        'letters':/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g
    },

    {
        'base':'tz',
        'letters':/[\uA729]/g
    },

    {
        'base':'u',
        'letters':/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g
    },

    {
        'base':'v',
        'letters':/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g
    },

    {
        'base':'vy',
        'letters':/[\uA761]/g
    },

    {
        'base':'w',
        'letters':/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g
    },

    {
        'base':'x',
        'letters':/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g
    },

    {
        'base':'y',
        'letters':/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g
    },

    {
        'base':'z',
        'letters':/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g
    }
    ],
    changes: '',

    removeDiacritics: function (str) {
        if(!common.changes) {
            common.changes = common.defaultDiacriticsRemovalMap;
        }
        for(var i=0; i< common.changes.length; i++) {
            str = str.replace(common.changes[i].letters, common.changes[i].base);
        }
        return str;
    },

    /**
 * load a link in ajax and write result in target element. Example Use:
 * <a href="/fr/dir/edit" class="ajaxToTarget" rel="#targetId">click here</a>
 */
    ajaxToTarget: function(e, obj) {
        e.preventDefault();
        ovModalBox.showActivity();
        if (obj) var self = $(obj);
        else var self = $(this);
        var url = self.attr('href');
        var targetId = self.attr('rel') || 'ovModalBox';
        var target = $(targetId);
        var type = self.attr('method') || 'GET';
        //var data = self.attr('method') || 'GET';

        /* Process classic ajax Call */
        $.ajax({
            type : type,
            url : url,
            //data : data,
            success : function(data) {
                ovModalBox.hideActivity();
                /* If there are no data, refresh parent page to reprocess with php control */
                if (!data || data == "undefined") {

                    //window.top.location.reload();
                    return;
                }
                else if (data != "undefined" && data != null && data.substring(0, 1) == '{') {
                    var json = JSON.parse(data);

                    if (json.message != "undefined" && json.message != null && json.message_type != "undefined" && json.message_type != null) {
                        var message_type = json.message_type;
                        var message = json.message;
                        if (message && message_type) common.ovFlashMessage(message, message_type);
                        if (message_type == 'error') ovModalBoxDiv.dialog("close");
                    }
                }
                else {
                    target.html(data);


                }

            }
        });

    },

    customPopup: function() {


    //    $('#cp-overlay').css();
    //
    //    $('.download-file').live('click', function() {
    //      $('#custom-popup').show();
    //      $('#cp-overlay').css({
    //        'opacity': 0.8,
    //        'width': $(document).width(),
    //        'height': $(document).height()
    //      });
    //      $('#cp-content').css({
    //        'left': Math.ceil(($(document).width() - $('#cp-content').width()) / 2).toString() + 'px',
    //        'top': Math.ceil($(window).scrollTop() + ($(window).height() - $('#cp-content').height()) / 2).toString() + 'px'
    //      });
    //      $('#cp-file').val($('#dlf').val());
    //      return false;
    //    });
    //      $('.close-overlay').live('click', function() {
    //        $('#custom-popup').hide();
    //        return false;
    //      });
    //
    //      $('#download-email').focus(function() {
    //        if ($(this).val() == $(this).attr('title')) {
    //          $(this).val('');
    //        }
    //      });
    //      <div id="custom-popup" style="display: none;">
    //      <div id="cp-overlay"></div>
    //      <div id="cp-content">
    //        <form method="post" accept-charset="utf-8">
    //          <div class="cl">&nbsp;</div>
    //          <h2 class="to-cufon" style="display: inline; float: left; width: 450px; font-size: 26px; color: #333333;">Download</h2>
    //          <a href="#" class="close-overlay notext" style="margin-top: 7px;">Close</a>
    //          <div class="cl">&nbsp;</div>
    //          <div class="cl" style="padding-top: 10px; border-bottom: 1px solid #f3f3f3; margin-bottom: 5px;">&nbsp;</div>
    //                  <div class="cp-warning">This is free, so let's see some I.D.</div>
    //                <input type="text" class="field" id="download-email" name="download-email" value="Enter your Email Address" title="Enter your Email Address" style="" />
    //          <div class="field-shadow">&nbsp;</div>
    //          <div class="cl" style="height: 10px;">&nbsp;</div>
    //          <input type="checkbox" name="newsletter" id="cp-newsletter" value="Yes"><label for="cp-newsletter" style="padding-left: 5px; margin-top: -1px;">Gimme the Momentum email newsletter</label>
    //          <div class="cl" style="height: 10px;">&nbsp;</div>
    //          <input type="checkbox" name="additional_info" id="cp-additional_info" value="Yes"><label for="cp-additional_info" style="padding-left: 5px; margin-top: -1px;">Send me additional information regarding Momentum services</label>
    //          <div class="cl" style="height: 20px;">&nbsp;</div>
    //          <input type="hidden" name="file" id="cp-file" value="" />
    //          <input type="submit" class="download-button notext" value="Download" />
    //        </form>
    //      </div>
    },

    oneSpace: function(str) {
        return str.replace(/\s+/g," ");
    },

    oneLineBreak: function(str, killThemAll) {
        if (killThemAll) {
            return str.replace(/(\r\n|\n|\r)/gm,"");
        }
        return str.replace(/(\r\n|\n|\r)+/gm,"\n");
    },

    ovAjaxDelete: function(deleteUrl, CSRFProtection) {

        var ret = false;

        var form = $('<form>')
        .attr('method', 'post')
        .attr('action', deleteUrl)
        .append(
            $('<input>').attr('type', 'hidden').attr('name', 'sf_method').attr('value', 'delete')
            );
        if(CSRFProtection) {
            form.append(
                $('<input>').attr('type', 'hidden').attr('name', CSRFProtection.name).attr('value', CSRFProtection.value)
                );
        }

        $.ajax({
            url: form.attr('action'),
            data: form.serializeArray(),
            type: form.attr('method'),
            cache: false,
            async: false,
            success: function(response) {

                ret = true;

                if(response) {
                    ret = JSON.parse(response);
                }
            },
            error: function() {
                ret = false;
            }
        });

        return ret;
    }

};



jQuery.fn.extend({
    /**
 * Changes the font-size until there is no line break
 *
 * @example $('div .elem').fit2Box();
 */
    fit2Box: function() {
        this.each(function() {
            if ($(this).css("display")!="block") return;

            //inhalt in zus?tzliche Div backen
            var content = $(this).html();
            $(this).html(""); //delete content because IE sucks

            var fontSize = $(this).css("fontSize").replace("px","");

            var width = $(this).width();
            var height = $(this).height();


            $(this).html('<div id="fit2Box" style="border: 1px solid red; position:absolute;">' + content+'</div>');

            var childElem = $('#fit2Box');
            var cHeight = childElem.height();
            var cWidth = childElem.width();

            //first make bigger (order important!)
            while (cWidth < width || cHeight < height) {
                $(this).css("fontSize", ++fontSize);
                $(this).html('<div id="fit2Box" style="border: 1px solid red; position:absolute;">' + content+'</div>');
                childElem = $('#fit2Box');
                cHeight = childElem.height();
                cWidth = childElem.width();
            }

            //than make smaller
            while (cWidth >= width || cHeight >= height) {
                $(this).css("fontSize", --fontSize);
                $(this).html('<div id="fit2Box" style="border: 1px solid red; position:absolute;">' + content+'</div>');
                childElem = $('#fit2Box');
                cHeight = childElem.height();
                cWidth = childElem.width();
            }

            $(this).html(content);


        });
    }


});

jQuery(document).ready(function() {
    common.init();
});


$.extend({
    getUrlVars: function(url){
        var vars = [], hash;
        var hashes = url.slice(url.indexOf('?') + 1).split('&');
        for(var i = 0; i < hashes.length; i++)
        {
            hash = hashes[i].split('=');
            vars.push(hash[0]);
            vars[hash[0]] = hash[1];
        }
        return vars;
    },
    getUrlVar: function(url, name){
        return $.getUrlVars(url)[name];
    }
});

$.maxZIndex = $.fn.maxZIndex = function(opt) {
    /// <summary>
    /// Returns the max zOrder in the document (no parameter)
    /// Sets max zOrder by passing a non-zero number
    /// which gets added to the highest zOrder.
    /// </summary>
    /// <param name="opt" type="object">
    /// inc: increment value,
    /// group: selector for zIndex elements to find max for
    /// </param>
    /// <returns type="jQuery" />
    var def = {
        inc: 10,
        group: "*"
    };
    $.extend(def, opt);
    var zmax = 0;
    $(def.group).each(function() {
        var cur = parseInt($(this).css('z-index'));
        zmax = cur > zmax ? cur : zmax;
    });
    if (!this.jquery)
        return zmax;

    return this.each(function() {
        zmax += def.inc;
        $(this).css("z-index", zmax);
    });
}

$.fn.slideShow = function(timeOut) {
    var $elem = this;
    this.children(':gt(0)').hide();
    setInterval(function() {
        $elem.children().eq(0).fadeOut(2000).next().fadeIn(2000).end().appendTo($elem);
    }, timeOut || 3000);
};


function toggle(handleObj, tartgetId) {
    var el = document.getElementById(tartgetId);

    if ( el.style.display != 'none' ) {
        handleObj.className = 'ov-toggle ov-toggle-closed';
        el.style.display = 'none';
    }
    else {
        el.style.display = '';
        handleObj.className = 'ov-toggle ov-toggle-opened';
    }
}

function print_r(arr,level) {
    var dumped_text = "";
    if(!level) level = 0;

    //The padding given at the beginning of the line.
    var level_padding = "";
    for(var j=0;j<level+1;j++) level_padding += "    ";

    if(typeof(arr) == 'object') { //Array/Hashes/Objects
        for(var item in arr) {
            var value = arr[item];

            if(typeof(value) == 'object') { //If it is an array,
                dumped_text += level_padding + "'" + item + "' ...\n";
                dumped_text += dump(value,level+1);
            } else {
                dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
            }
        }
    } else { //Stings/Chars/Numbers etc.
        dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
    }
    return dumped_text;
}




function tabHandleKeyDown(evt) {
    return true;
    var tab = String.fromCharCode(9);
    var e = window.event || evt;
    var t = e.target ? e.target : e.srcElement ? e.srcElement : e.which;
    var scrollTop = t.scrollTop;
    var k = e.keyCode ? e.keyCode : e.charCode ? e.charCode : e.which;
    if (k == 9 && !e.ctrlKey && !e.altKey) {
        if(t.setSelectionRange){
            e.preventDefault();
            var ss = t.selectionStart;
            var se = t.selectionEnd;
            // Multi line selection
            if (ss != se && t.value.slice(ss,se).indexOf("\n") != -1) {
                if(ss>0){
                    ss = t.value.slice(0,ss).lastIndexOf("\n")+1;
                }
                var pre = t.value.slice(0,ss);
                var sel = t.value.slice(ss,se);
                var post = t.value.slice(se,t.value.length);
                if(e.shiftKey){
                    var a = sel.split("\n")
                    for (i=0;i<a.length;i++){
                        if(a[i].slice(0,1)==tab||a[i].slice(0,1)==' ' ){
                            a[i]=a[i].slice(1,a[i].length)
                        }
                    }
                    sel = a.join("\n");
                    t.value = pre.concat(sel,post);
                    t.selectionStart = ss;
                    t.selectionEnd = pre.length + sel.length;
                }
                else{
                    sel = sel.replace(/\n/g,"\n"+tab);
                    pre = pre.concat(tab);
                    t.value = pre.concat(sel,post);
                    t.selectionStart = ss;
                    t.selectionEnd = se + (tab.length * sel.split("\n").length);
                }
            }
            // Single line selection
            else {
                if(e.shiftKey){
                    var brt = t.value.slice(0,ss);
                    var ch = brt.slice(brt.length-1,brt.length);
                    if(ch == tab||ch== ' '){
                        t.value = brt.slice(0,brt.length-1).concat(t.value.slice(ss,t.value.length));
                        t.selectionStart = ss-1;
                        t.selectionEnd = se-1;
                    }
                }
                else{
                    t.value = t.value.slice(0,ss).concat(tab).concat(t.value.slice(ss,t.value.length));
                    if (ss == se) {
                        t.selectionStart = t.selectionEnd = ss + tab.length;
                    }
                    else {
                        t.selectionStart = ss + tab.length;
                        t.selectionEnd = se + tab.length;
                    }
                }
            }
        }
        else{
            e.returnValue=false;
            var r = document.selection.createRange();
            var br = document.body.createTextRange();
            br.moveToElementText(t);
            br.setEndPoint("EndToStart", r);
            //Single line selection
            if (r.text.length==0||r.text.indexOf("\n") == -1) {
                if(e.shiftKey){
                    var ch = br.text.slice(br.text.length-1,br.text.length);
                    if(ch==tab||ch==' '){
                        br.text = br.text.slice(0,br.text.length-1)
                        r.setEndPoint("StartToEnd", br);
                    }
                }
                else{
                    var rtn = t.value.slice(br.text.length,br.text.length+1);
                    if(rtn!=r.text.slice(0,1)){
                        br.text = br.text.concat(rtn);
                    }
                    br.text = br.text.concat(tab);
                }
                var nr = document.body.createTextRange();
                nr.setEndPoint("StartToEnd", br);
                nr.setEndPoint("EndToEnd", r);
                nr.select();
            }
            //Multi line selection
            else{
                if(e.shiftKey){
                    var a = r.text.split("\r\n")
                    var rt = t.value.slice(br.text.length,br.text.length+2);
                    if(rt==r.text.slice(0,2)){
                        var p = br.text.lastIndexOf("\r\n".concat(tab));
                        if(p!=-1){
                            br.text = br.text.slice(0,p+2).concat(br.text.slice(p+3,br.text.length));
                        }
                    }
                    for (i=0;i<a.length;i++){
                        var ch = a[i].length>0&&a[i].slice(0,1);
                        if(ch==tab||ch==' '){
                            a[i]=a[i].slice(1,a[i].length)
                        }
                    }
                    r.text = a.join("\r\n");
                }
                else{
                    if(br.text.length>0){
                        var rt = t.value.slice(br.text.length,br.text.length+2);
                        if(rt!=r.text.slice(0,2)){
                            r.text = tab.concat(r.text.split("\r\n").join("\r\n".concat(tab)));
                        }
                        else{
                            var p = br.text.slice(0,ss).lastIndexOf("\r\n")+2;
                            br.text = br.text.slice(0,p).concat(tab,br.text.slice(p,br.text.length));
                            r.text = r.text.split("\r\n").join("\r\n".concat(tab));
                        }
                    }
                    else{
                        r.text = tab.concat(r.text).split("\r\n").join("\r\n".concat(tab));
                    }
                }
                var nr = document.body.createTextRange();
                nr.setEndPoint("StartToEnd", br);
                nr.setEndPoint("EndToEnd", r);
                nr.select();
            }
        }
    }
    t.scrollTop = scrollTop;
}

