/*** functions ***/
function doAjax(scripts) {
    $.each(scripts, function(index, value) {
        if (!value.match(/^\//) && !value.match(/^http/)) {
            value = '/javascript/'+value;
        }
        $.ajax({
            url: value,
            dataType: 'script',
            cache: true,
            async: false
        });
    });
}

function get_script(dom, scripts, callback) {
    if ($(dom).length > 0) {
        /** mise en array **/
        if (!$.isArray(scripts)) {
            scripts = new Array(scripts);
        }

        $.when (doAjax(scripts))
            .then(callback)
            .fail(function(){
                console.log( 'Je ne me déclenche que si une requête ou plus a rencontré une erreur.' );
            });
    }
}

function get_css(url, folder) {
    if (!folder) var folder = '/style/';
    $("head").append("<link>");
    css = $("head").children(":last");
    css.attr({
        rel: "stylesheet",
        type: "text/css",
        href: folder+url
    });
}

$.extend({
  getUrlVars: function(){
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.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(name){
    return $.getUrlVars()[name];
  }
});

function sendform(endroit){
    document.getElementById("envoie").value=endroit;
    /*$(window).unbind('beforeunload', catcher);*/
    document.adminform.submit();
    return false;
}

function submitform(me, value) {
    var submit = true;
    if (me.data('json').action)
        $('#_action').val(me.data('json').action);
    if (me.data('json').redirect)
        $('#_redirect').val(me.data('json').redirect);
    if (value)
        $('#_value').val(value);
    else if (me.data('json').value)
        $('#_value').val(me.data('json').value);

    //Confirmation
    if (me.data('json').confirm) {
        var count = $(".checked_list :checkbox:checked").length;
        if (count == 0) {
            alert('Aucun élément séléctionné');
            return false;
        } else if (count == 1) {
            var question = 'Êtes-vous sûr de vouloir effectuer l\'action pour cet élément ?';
        } else {
            var question = 'Êtes-vous sûr de vouloir effectuer l\'action pour ces '+count+' éléments ?';
        }
        if (!confirm(question)) {
            submit = false;
        }
    }
    if (submit)
        $('form').submit();
    return false;
}

/*** Submit a form via Ajax. Response in Json format ***/
function submit_ajax_form(form, url, callback) {
    var data = new Object();
    $('input,select,textarea').each(function() {
        var name = $(this).attr('name');
        var type = $(this).attr('type');
        if (type == 'checkbox')
            var value = $(this).attr('checked')?1:0;
        else if (type == 'radio')
            var value = $('input:radio:checked[name='+name+']').val();
        else
            var value = $(this).val();
        data[name] = value;
    });

    data[ci_csrf_token] = $('input[name=ci_csrf_token]').val();
    $.ajax({
        type: 'POST',
        url: url,
        dataType: 'json',
        data: data,
        success: callback
    });
}

/*
 * Reload select boxes for filtering and display products according to the filters
 * @param data returned items from the first ajax dropdown
 * @param type select name
 * @param val selected value
 * @param cat catalog category
 * @param dropdown_type update only 'next' or update 'all' fields
 */
function catalog_dropdown(data, type, val, cat, dropdown_type) {
    $.each(data, function(index, value) {
        if ((index==0 && val != "" && dropdown_type =='next') || (dropdown_type =='all' && type != value)) {
            var is_selected = $('select[name="'+value+'"] option:selected').val();
            $('select[name="'+value+'"]').empty();
            /* première valeur get_dropdown ou toute si le type de dropdown est all */
            $.ajax({
                url: '/catalog/product/ajax_dropdown/'+cat+'/'+dropdown_type+'/'+value,
                dataType: 'json',
                success: function(dropdown){
                    $('select[name="'+value+'"]').attr('disabled', '');
                    $.each(dropdown, function (i, obj) {
                        $.each(obj, function (k, v) {
                            $('select[name="'+value+'"]').attr('options')[i] = new Option(v, k, false, false);
                            if (is_selected == v && type != "") {
                                $('select[name="'+value+'"] option[value="'+v+'"]').attr("selected","selected");
                            }
                        });
                    });
                }
            });
        } else if (dropdown_type =='next') {
            /* disabled les autres */
            $('select[name="'+value+'"]').empty();
            $('select[name="'+value+'"]').attr('disabled', 'disabled');
        }
    });
    reload_ajax_content('/catalog/product/products/'+cat, '#products');
}

function split(val) {
    return val.split(/,\s*/);
}

function extractLast(term) {
    return split(term).pop();
}

/*** Replace target's block content by ajax content ! ***/
/*** Usage: <a class="ajax_block_link" data-url="ajax url" data-target="#target" href="l'url de la page"><div id="target">content will appear here</div>***/
/*** Dans le controleur $this->load->view('fastsite/'.(isset($_POST['ajax']) ? 'ajax' : 'home'), $data); ***/

function reload_ajax_content(url, target, callback) {
    $.ajax({
        type: 'GET',
        url: url,
        data: "ajax=1",
        success: function(data){
            $(target).html(data);
            if ($.isArray(callback)) {
                $.each(callback, function(k,v) {
                    v(target, data);
                });
            }
            else if (callback) {
                callback(target, data);
            }
        }
    });
    return false;
}

/*** Display ajax lightbox ***/
function display_ajax_lightbox(callback) {
    get_script('#ajax_lightbox', 'jquery.lightbox_me.js', function(){
        $('#ajax_lightbox').lightbox_me({
            centered: true,
            onLoad: function() {
                $('#ajax_lightbox').find('input:first').focus();
                if (callback)
                    callback;
            },
            closeSelector: '.close',
            zIndex: 10000
        });
    });
}

/*** Create a sortable tree ***/
function create_tree() {
    toArray = $('ol.sortable').nestedSortable('toArray', {startDepthCount: 0, expression: (/(list)[_](.+)/)});
    toJson = $.toJSON(toArray);
    $('#tree').val(toJson);
}

function tax_price(element, mode) {
    var ancestor = element.parent().parent();
    var from = element.attr('id');
    var value = parseFloat(element.val());
    var tax = ancestor.find('.tax :selected').text().replace(/([^0-9\.])/g, ''); // extract the value from option
    if (!isNaN(value) && !isNaN(tax)) {
        if (mode == 'wt') {
            $(ancestor.find('.price_wt')).val(Math.round((value * (1+tax/100))*100)/100);
        } else {
            $(ancestor.find('.price_wot')).val(Math.round((value / (1+tax/100))*100)/100);
        }
    }
}

var geocoder;
function gmaps_initialize(dom_map, address, name) {
    geocoder = new google.maps.Geocoder();
    geocoder.geocode( { 'address': address}, function(results, status) {
        var latlng = results[0].geometry.location;
        var myOptions = {
          zoom: 8,
          center: latlng,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        }
        //map = new google.maps.Map(document.getElementById('gmaps'), myOptions);
        map = new google.maps.Map(dom_map, myOptions);
        /*var marker = new google.maps.Marker({
            map: map,
            position: latlng
        });*/
        var infoWindow = new google.maps.InfoWindow({
            content: "<strong>"+name+"</strong><br />"+address,
            position: latlng
        });
        infoWindow.open(map);
    });
};

function acl_checkbox(me, module) {
    tocheck = me.data('json').tocheck;
    if ($(tocheck).length == $(tocheck +':checked').length) {
        me.attr('checked', true);
    }
}
var tinymce_serialize = function (me) {
    var str = me.serialize();
    str = str.replace(/%3Cp%3E%3Cbr\+_mce_bogus%3D%221%22%3E%3C%2Fp%3E/g, "");
    str = str.replace(/br\+_mce_bogus%3D%221%22%3E%3C/g, "");
    str = str.replace(/_mce_style="[.*]"/g, "");
    return str;
};
var catcher = function() {
    var changed = false;
    if ($('.unload_catcher').data('initialForm') != tinymce_serialize($('.unload_catcher'))) {
        changed = true;
        console.log($('.unload_catcher').data('initialForm'));
        console.log(unescape(tinymce_serialize($('.unload_catcher'))));
    }
    if (changed) {
        return 'Le formulaire a été modifier!';
    }
};

function unload_catcher() {
    $('.unload_catcher').data('initialForm', tinymce_serialize($('.unload_catcher')));
    $(window).bind('beforeunload', catcher);
}

function is_updated(me) {
    me.parents('tr').attr('class', 'updated');
}

/*** events ***/
/***
 * sumbit_redirect - 1.5.1
 * autoresize - 1.5.1
 * editable - 1.5.1
 * copy_input - 1.5.1
 * reduce - 1.5.1
 * expand - 1.5.1
 * datepicker - 1.5.1
 * autocomplete - 1.5.1 work with addrow
 * autocomplete_multi - 1.5.1
 * upload - 1.5.1
 * upload_multi
 * addrow - 1.5.1
 * removerow - 1.5.1
 * generate_select
 * lightbox_link - 1.5.1
 * ajax_lightbox_link - 1.5.1
 * ajax_block_link
 * gallery
 * lightbox FAIL
 * fade_out
 * slidetoggle
 * sort - 1.5.1
 * sort_tree - 1.5.1
 * sortable - 1.5.1
 * sortable2 - 1.5.1
 * removeli - 1.5.1
 * default-value - 1.5.1
 * sticky - 1.5.1
 * autochecked - 1.5.1
 * price_wot - 1.5.1
 * price_wt - 1.5.1
 * tax - 1.5.1
 * acl - 1.5.1
 * mask - 1.5.1 work with addrow
 ***/

$(document).ready(function() {

    /*** submit & redirect ***/
    $('.submit_redirect').click(function(){
        submitform($(this));
        return false;
    });

    $('.dropdown_submit_redirect').change(function(){
        submitform($(this), $(this).val());
        return false;
    });

    $('.confirm, .buttons_right .btn_delete').click(function(){
        var question = 'Êtes-vous sûr de vouloir effectuer l\'action pour cet élément ?';
        return confirm(question);
    });

    $('#checkall').click(function() {
        $('.checked_list :checkbox').attr('checked', this.checked);
    });

    /*** check other checkbox ***/
    /*** Usage: <input type="checkbox" class="checkother" data-json="{"tocheck" => ".class"}"/>***/
    $('.checkother').click(function() {
        tocheck = $(this).data('json').tocheck;
        $(tocheck).attr('checked', this.checked);
        if ($(this).attr('name') == 'checkmodule')
            acl_checkbox($(this), true);
        else if ($(this).attr('name') == 'checkcont')
            acl_checkbox($(this), false);
    });

    /********** DCF ***************/
    $('.dcf_niv').change(function(){
       $(this).parent().parent().attr('class','l'+$(this).val());
    });

    $('#dcf_addrow').click(function(){
       var clonerow = $('.dcf_list tr:last').clone(true);
       clonerow.removeClass('hidden');
       $('.dcf_list').append(clonerow);
    });

    /**** autoresize ***/
    get_script('textarea.autoresize', 'jquery.autoresize.js', function(){
        $('textarea.autoresize').autoResize({
            // On resize:
            onResize : function() {
                $(this).css({opacity:0.8});
            },
            // After resize:
            animateCallback : function() {
                $(this).css({opacity:1});
            },
            // Quite slow animation:
            animateDuration : 300,
            // More extra space:
            extraSpace : 20
        }).trigger('change');
    });

    /**** editable ***/
    // session values are editable
    $('.sessions-value').addClass('editable');

    // add the editable feature to all elements
    // controller editable (pour un edit avec ajax)
    // editable (pour un edit simple)
    get_script('.editable', ['jquery-ui/jquery-ui-1.8.14.custom.min.js', 'jquery.editinplace.js'], function(){
        $('.editable').each( function(){
            var controller = '';
            var method = '';
            var field = '';
            var conditions = '';
            var type = '';
            var callback = null;
            if($(this).data('json')) {
                controller = $(this).data('json').controller;
                //editable
                method = $(this).data('json').method;
                field = $(this).data('json').field;
                if ($(this).data('json').conditions) conditions = $(this).data('json').conditions;
                if ($(this).data('json').callback) {
                    callback = $(this).data('json').callback;
                    var me = $(this);
                }
                if ($(this).text().length > 80) type = 'textarea';
                else type = 'text';
                $(this).editInPlace({
                    url: '/'+controller+'/'+method+'/',
                    data: {
                        field : field,
                        conditions : conditions,
                        ci_csrf_token : $('input[name=ci_csrf_token]').val()
                    },
                    show_buttons: false,
                    field_type: type,
                    textarea_cols: 50,
                    textarea_rows: 3,
                    success : function(data){
                        if (callback) {
                            window[callback](me);
                        }
                    }
                });
            }
        });
    });

    /*** copy input ***/
    $('.copy_input').change(function() {
        var inputs = jQuery.parseJSON($(this).attr('id'));
        var val = $(this).val();
        $.each(inputs,function(index, obj) {
            if ($('input[name="'+obj.input+'"]').val()=="") {
                if (obj.url) {
                    $.ajax({
                        type: 'POST',
                        url: obj.url,
                        data: {
                            str : val,
                            ci_csrf_token : $('input[name=ci_csrf_token]').val()
                        },
                        success: function(data) {
                            $('input[name="'+obj.input+'"]').val(data);
                        }
                    });
                } else {
                    $('input[name="'+obj.input+'"]').val(val);
                }
            }
        });
    });

    /*** reduce expand the next div via a button ***/
    /*** Usage : <span class="expand">more detail</span><div>the detail</div>***/

    /**** reduce expend ****/
    $('.reduce').live('click', function(){
        id = $(this).attr('id');
        $(this).next('.'+id).hide();
        $(this).removeClass('reduce');
        $(this).addClass('expand');
    });

    $('.expand').live('click', function(){
        id = $(this).attr('id');
        $(this).next('.'+id).show();
        $(this).removeClass('expand');
        $(this).addClass('reduce');
    });

    /**** datepicker ****/

    get_script('.datetimepicker, .datepicker, datepicker_locale', 'jquery-ui/jquery-ui-1.8.14.custom.min.js', function(){
        date_obj = new Date();
        date_obj_hours = date_obj.getHours();
        date_obj_mins = date_obj.getMinutes();
        date_obj_sec = date_obj.getSeconds();
        date_obj_time = date_obj_hours+':'+date_obj_mins+':'+date_obj_sec;

        $(".datetimepicker").live('focus', function(){
            $(this).datepicker({ dateFormat: 'yy-mm-dd '+date_obj_time });
        });
        $(".datepicker").live('focus', function(){
            console.log('je suis focus');
            $(this).datepicker({ dateFormat: 'yy-mm-dd ' });
        });
        $(".datepicker_locale").live('focus', function(){
            $(this).datepicker({ dateFormat: 'dd/mm/yy' });
        });
    });
    /*** Date condition for admin filters ***/
    $('#datepicker_ok').click(function(){
        s=$('#datepicker_date_condition').val().trim();
        e=$('#datepicker_date_condition_end').val().trim();
        controller = $(this).data('json').controller;
        method = $(this).data('json').method;
        document.location.href='/'+controller+'/'+method+'.html?date_condition='+s+'&date_condition_end='+e;
        return false;
    });

    /*** autocomplete ***/
    /*** Méthode json ***/
    /*** <input class="autocomplete" type="text" data-json='{"controller":"controller", "method":"method", "field":"field", "label":"label"}'/> ****/

    get_script('.autocomplete, .autocomplete_multi', 'jquery-ui/jquery-ui-1.8.14.custom.min.js', function(){
        $(".autocomplete").live('focus', function(){
            var controller = '';
            var method = '';
            var field = '';
            var label = '';
            var conditions = '';
            if($(this).data('json')) {
                controller = $(this).data('json').controller;
                method = $(this).data('json').method;
                field = $(this).data('json').field;
                if ($(this).data('json').label) label = $(this).data('json').label;
                else label = field;
                if ($(this).data('json').conditions) conditions = $(this).data('json').conditions;
                $(this).autocomplete({
                    source: function(request, response) {
                      $.ajax({
                            type: 'POST',
                            url: '/'+controller+'/'+method,
                            dataType: 'json',
                            data: {
                                search : request.term,
                                field : field,
                                label : label,
                                conditions : conditions,
                                ci_csrf_token : $('input[name=ci_csrf_token]').val()
                            },
                            success: function(data){
                                response(data.message);
                            }
                        })
                    },
                    minLength: 2
                });
            }
        });
        $(".autocomplete_multi").live('focus', function(){
            var controller = '';
            var method = '';
            var field = '';
            var label = '';
            var conditions = '';
            if($(this).data('json')) {
                controller = $(this).data('json').controller;
                method = $(this).data('json').method;
                field = $(this).data('json').field;
                if ($(this).data('json').label) label = $(this).data('json').label;
                else label = field;
                if ($(this).data('json').conditions) conditions = $(this).data('json').conditions;
                $(this).autocomplete({
                    source: function(request, response) {
                      $.ajax({
                            type: 'POST',
                            url: '/'+controller+'/'+method,
                            dataType: 'json',
                            data: {
                                search : request.term,
                                field : field,
                                label : label,
                                conditions : conditions,
                                ci_csrf_token : $('input[name=ci_csrf_token]').val()
                            },
                            success: function(data){
                                response(data.message);
                            }
                      })
                    },
                    minLength: 2,
                    focus: function() {
                        // prevent value inserted on focus
                        //return false;
                    },
                    select: function(event, ui){
                       var terms = split( this.value );
                        // remove the current input
                        terms.pop();
                        // add the selected item
                        terms.push( ui.item.value );
                        // add placeholder to get the comma-and-space at the end
                        terms.push("");
                        this.value = terms.join(", ");
                        return false;
                    }
                });
            }
        });
    });

    /*** autocomplete_geo ***/
    get_script('.autocomplete_geo', 'jquery-ui/jquery-ui-1.8.2.custom.min.js', function(){
        $(".autocomplete_geo").live('focus', function(){
            geocoder = new google.maps.Geocoder();
            $(this).autocomplete({
                source: function(request, response) {
                    geocoder.geocode( {'address': request.term+', France' }, function(results, status) {
                      response($.map(results, function(item) {
                        return {
                          label: item.formatted_address,
                          value: item.formatted_address
                        }
                      }));
                    })
                }
             });
        });
    });
    /**** upload && upload multi ***/
    get_script('.upload, .upload_multi', 'ajaxupload.js', function(){
        $('.upload, .upload_multi').each(function(index){
            var button = $(this);
            var method = $(this).data('json').method;
            var name = $(this).data('json').name;
            var post_name = $(this).data('json').post_name;
            var allowed_types = $(this).data('json').allowed_types.replace(/_/g, '|');
            var max_size = $(this).data('json').max_size;

            new AjaxUpload(button,{
                action: '/'+method+'/'+name,
                name: 'Filedata',
                onSubmit : function(file, ext){
                    var regex = new RegExp('^'+allowed_types+'$', 'i');
                    if (ext && regex.test(ext)){
                        button.addClass('loading');
                        this.disable();
                    } else {
                        alert('Seuls les fichiers '+allowed_types.replace(/\|/g, ', ')+' de moins de '+max_size+'Ko sont autorisés');
                        return false;
                    }
                },
                onComplete: function(file, response){
                    response = jQuery.parseJSON(response);
                    button.removeClass('loading');
                    this.enable();

                    if (response.error != '') {
                        button.addClass('error');
                        alert(response.error);
                    } else {
                        button.removeClass('error');
                        cache = new Date().getTime();
                        if (button.hasClass('upload_multi')) {
                            button.before('<span class="mod_upload">\n\
                                <span class="btn_upload_delete"></span>\n\
                                <span class="btn_upload_img success"><img src="'+response.img_src+'?time='+cache+'"/></span>\n\
                                <input name="'+post_name+'" value="'+response.file_name+'" type="hidden"/>\n\
                                </span>');
                            $('.upload_form').append('');
                        } else {
                            button.addClass('success');
                            button.html('<img src="'+response.img_src+'?time='+cache+'"/>');
                            button.next('input[type=hidden]').val(response.file_name);
                        }
                    }
                }
            });
        });
        $('.btn_upload_delete').live('click', function() {
            $(this).parents('.mod_upload').fadeOut();
            $(this).parents('.mod_upload').remove();
        });
    });

    /**** clone a row ***/
    $('.addrow').click(function(){
        // id must contain :
        // 1st param the container element's id
        // 2nd param the type of element to clone
        // optional 3rd param : int max rows
        // optional 4th param : a class containing the counter
        var cf = $(this).attr('id').split('-', 4);
        var num = 0;
        if (cf[3]) {
            num = parseInt($('#'+cf[0]+' '+cf[1]+':last .'+cf[3]+':first').text());
            if (!num)
                num = parseInt($('#'+cf[0]+' '+cf[1]+':last .'+cf[3]+':first').val());
        }
        var clonerow = $('#'+cf[0]+' '+cf[1]+':last').clone(false);
        $(':input',clonerow).clearform();
        $('#'+cf[0]).append(clonerow);
        if (cf[1] != 'tr') {
            clonerow.hide();
            clonerow.slideDown();
        }
        if (cf[2] && cf[2] > 0 && num+1 >= cf[2]) {
            $(this).hide();
        }
        if (cf[3]) {
            $('#'+cf[0]+' '+cf[1]+':last .'+cf[3]).text(num+1);
            $('#'+cf[0]+' '+cf[1]+':last .'+cf[3]).val(num+1);
        }
    });

    $('.removerow').live('click', function(){
        // id must contain :
        // 1st param the container element's id
        // 2nd param the type of element to clone
        var cf = $(this).attr('id').split('-', 2);
        var num = $('#'+cf[0]+' '+cf[1]).size();
        if (num > 1) {
            $(this).parents('#'+cf[0]+' '+cf[1]).fadeOut();
            $(this).parents('#'+cf[0]+' '+cf[1]).remove();
        }
    });

    /**** clear form inside a container ***/
    $.fn.clearform = function() {
        return this.each(function() {
            var type = this.type, tag = this.tagName.toLowerCase();
        if (tag == 'form')
            return $(':input',this).clearform();
        if (type == 'text' || type == 'password' || tag == 'textarea')
            this.value = '';
        else if (type == 'checkbox' || type == 'radio')
            this.checked = false;
        else if (tag == 'select') {
            this.selectedIndex = 0;
            $(this).find('option:disabled').attr('disabled', '');
        }
        });
    };

    /*** Generate Select ***/
    $('.generate_select').live('change', function() {
        var cf = $(this).attr('id').split('-',3);
        var controller = cf[0];
        var method = 'generate_select';
        var field = cf[1];
        if (cf[2]) var label = cf[2];
        else var label = cf[1];

        var current = $(this).index('.linked');

        if ($(this).val() == '') {
            $('.linked:gt('+(current)+')').empty();
            $('.linked:gt('+(current)+')').attr('disabled', 'disabled');
        } else {
            var select = $('.linked').eq(current+1).attr('options');
            $('.linked:lt('+(current+2)+')').attr('disabled', '');
            $('.linked:gt('+(current+1)+')').attr('disabled', 'disabled');

            $.ajax({
                type: 'POST',
                url: '/'+controller+'/'+method,
                dataType: 'json',
                data: {
                    search : $(this).val(),
                    field : field,
                    label : label,
                    ci_csrf_token : $('input[name=ci_csrf_token]').val()
                },
                success: function(data){
                    select.length = 0;
                    select[select.length] = new Option('', '', true, true);
                    $.each(data.message, function () {
                        select[select.length] = new Option(this.label, this.value, false, false);
                    });
                }
            });
        }
    });

    /*** Generate Select ***/
    $('.catalog_dropdown').live('change', function() {
        var type = $(this).attr('name');
        var val = $(this).val();
        var cat = $('input[name="cat"]').val();
        var dropdown_type = $('input[name="dropdown_type"]').val();
        /* récupéré la config et suppression session */
        $.ajax({
            type: 'POST',
            url: '/catalog/product/ajax_create_dropdowns/'+cat+'/'+dropdown_type+'/'+type,
            dataType: 'json',
            data: {
                search : val,
                ci_csrf_token : $('input[name=ci_csrf_token]').val()
            },
            success: function(data) {catalog_dropdown(data, type, val, cat, dropdown_type);}
        });
    });

    $('.catalog_reset').live('click', function() {
        var cat = $('input[name="cat"]').val();
        var dropdown_type = $('input[name="dropdown_type"]').val();
        $.ajax({
            url: '/catalog/product/ajax_reset_dropdowns/'+cat+'/'+dropdown_type,
            dataType: 'json',
            success: function(data) {catalog_dropdown(data, '', '', cat, dropdown_type);}
        });
    });

    /*** Lightbox something ! ***/
    get_script('.lightbox_link', 'jquery.lightbox_me.js', function(){
        $('.lightbox_link').click(function() {
            var id = $(this).attr('id').split('-')[1];
            $("#lightbox-"+id).lightbox_me({
                centered: true,
                onLoad: function() {$("#lightbox-"+id).find("input:first").focus();},
                closeSelector: '.close'
            });
            return false;
        });
    });

    /*** Lightbox something and display ajax content ! ***/
    /*** Usage: <a class="ajax_lightbox_link" href="l'url de la page">***/
    /*** Dans le controlleur $this->load->view('fastsite/'.(isset($_POST['ajax']) ? 'ajax' : 'home'), $data); ***/
     get_script('.ajax_lightbox_link', 'jquery.lightbox_me.js', function(){
        $('.ajax_lightbox_link').click(function() {
            reload_ajax_content($(this).attr('href'), '#ajax_lightbox', display_ajax_lightbox);
            return false;
        });
    });

    /*** Link to replace target's block content by ajax content ! ***/
    /*** Usage: <a class="ajax_block_link" data-url="ajax url" data-target="#target" href="l'url de la page"><div id="target">content will appear here</div>***/
    /*** Dans le controleur $this->load->view('fastsite/'.($this->input->post('ajax') ? 'ajax' : 'home'), $data); ***/
    $('.ajax_block_link').live('click', function() {
        reload_ajax_content($(this).data('url'), $(this).data('target'));
        return false;
    });

    get_script('.gallery, a[rel^=lightbox]', 'jquery.lightbox-0.5.js', function(){
        get_css('jquery.lightbox-0.5.css');
        /*** Lightbox images ***/
        /*** Usage: <div class="gallery"><a href="image">Link</a></div> ***/
        /*** Usage multiple gallery: <div class="gallery" id="g1"><a href="image">Link</a></div><div class="gallery" id="g2"><a href="image">Link</a></div> ***/
        var lightbox_options = {
            imageLoading: '/images/lightbox/ico-loading.gif',
            imageBtnClose: '/images/lightbox/btn-close.gif',
            imageBtnPrev: '/images/lightbox/btn-prev.gif',
            imageBtnNext: '/images/lightbox/btn-next.gif',
            containerResizeSpeed: 350,
            txtImage: 'Image',
            txtOf: 'de'
        };
        $('.gallery').each(function() {
            var id = $(this).attr('id');
            if (id) {
                $('#'+id+' a[class!="nogallery"]').lightBox(lightbox_options);
            } else {
                $('.gallery a[class!="nogallery"]').lightBox(lightbox_options);
                return false;
            }
        });

        /*** Lightbox images boxen version ***/
        /*** http://stackoverflow.com/questions/2051294/making-jquery-lightbox-plugin-work-with-multiple-galleries ***/
        /*** <a href="images/image1.jpg" rel="lightbox-gallery1"><img border="0" height="50" src="images/image1_thumbnail.jpg" width="50" /> ***/
        var boxen = [];
        //find all links w/ rel=lightbox-...
        $('a[rel^=lightbox]').each(function() {
            //push only unique lightbox-gallery_name into boxen array
            if ($.inArray($(this).attr('rel'),boxen)) boxen.push($(this).attr('rel'));
        });
        //for each unique lightbox group, apply the lightBox
        $(boxen).each(function(i,val) { $('a[rel='+val+']').lightBox(lightbox_options); });
    });

    /*** Fade out ***/
    $('.fade_out').delay(3200).fadeOut('slow');

    /*** Slide toggle ***/
    /*** Usage: <a class="slidetoggle" href="#anchor"></a>***/
    $('.slidetoggle').live('click', function() {
    var id = $(this).attr('href') || $(this).attr('id');
    var me = $(this);
    $(id).slideToggle('fast', 'linear', function () {
        if ($(id).is(':visible')) {
            me.find('span').removeClass('arrow_white').addClass('arrow_white_top');
            me.find('span').removeClass('arrow_grey').addClass('arrow_grey_top');
            /*$('html, body').animate({
                scrollTop: $(me.attr('href')).offset().top
            }, 500);*/
        } else {
            me.find('span').removeClass('arrow_white_top').addClass('arrow_white');
            me.find('span').removeClass('arrow_grey_top').addClass('arrow_grey');
        }
        return true;
        });
    });

    /*** sortable ***/
    var fixHelper = function(e, ui) {
        ui.children().each(function() {
            $(this).width($(this).width());
        });
        return ui;
    };

    /***usage sort et sort_tree***/
    /**
     * id = list-pk OU list-pk|pk|pk en cas de pks sur la ligne a trier li ou tr
     * id = controller-le_controller sur le container a trier table ou ol
    **/
    get_script('table.sort tbody', 'jquery-ui/jquery-ui-1.8.14.custom.min.js', function(){
        $('table.sort tbody').sortable({
            helper: fixHelper,
            stop: function(event,ui){
                var toString = '';
                toString = $('table.sort tbody').sortable('serialize', { expression: '(list)-(.+)' });
                controller = $('table.sort').attr('id').split('-', 2)[1];
                cond_controller = controller;
                if($('table.sort').data('json')) {
                    controller = $('table.sort').data('json').list_sort_controller;
                    cond_controller = $('table.sort').data('json').controller;
                }
                method = 'sort';
                $.ajax({
                    type: 'POST',
                    url: '/'+controller+'/'+method,
                    data: toString+'&cond_controller='+cond_controller+'&ci_csrf_token='+$('input[name=ci_csrf_token]').val()
                });
            }
        });
    });

    get_script('ol.sort_tree, ol.sortable, ol.sortable2, .removeli .sortable input', ['jquery-ui/jquery-ui-1.8.14.custom.min.js', 'jquery.json-2.2.min.js', 'jquery-ui/jquery.ui.nestedSortable.js'], function(){
        $('ol.sort_tree').nestedSortable({
            disableNesting: 'no-nest',
            forcePlaceholderSize: true,
            handle: 'div',
            items: 'li',
            opacity: .6,
            placeholder: 'placeholder',
            tabSize: 25,
            tolerance: 'pointer',
            toleranceElement: '> div',
            receive: function(e,ui) {
                copyHelper= null;
            },
            update: function() {
                toArray = $('ol.sort_tree').nestedSortable('toArray', {startDepthCount: 1, expression: '(list)-(.+)'});
                toJson = $.toJSON(toArray);
                controller = $('ol.sort_tree').attr('id').split('-', 2)[1];
                method = 'sort_tree';
                $.ajax({
                    type: 'POST',
                    url: '/'+controller+'/'+method,
                    data: {
                        list: toJson,
                        ci_csrf_token : $('input[name=ci_csrf_token]').val()
                    }
                });
            }
        });

        $('ol.sortable').nestedSortable({
            disableNesting: 'no-nest',
            forcePlaceholderSize: true,
            handle: 'div',
            items: 'li',
            opacity: .6,
            placeholder: 'placeholder',
            tabSize: 25,
            tolerance: 'pointer',
            toleranceElement: '> div',
            receive: function(e,ui) {
                copyHelper= null;
                $('.sortable :input').removeAttr("disabled");
            },
            update: create_tree
        });

        $('ol.sortable2').nestedSortable({
            disableNesting: 'no-nest',
            forcePlaceholderSize: true,
            handle: 'div',
            items: 'li',
            opacity: .6,
            placeholder: 'placeholder',
            tabSize: 25,
            tolerance: 'pointer',
            toleranceElement: '> div',
            connectWith: '.sortable_connected',
            helper: function(e,li) {
                copyHelper= li.clone().insertAfter(li);
                return li.clone();
            },
            stop: function() {
                copyHelper && copyHelper.remove();
            }
        }).disableSelection();

        $('.removeli').live('click', function(){
            $(this).parent('div').parent('li').remove();
            create_tree();
        });

        $('.sortable input').live('change', function() {
            create_tree();
        });

    });

    /*** Input default value ***/
    /*** To configure default inactive color use class "default-value-inactive" ***/
    $('.default-value:input').addClass('default-value-inactive');
    var default_values = new Array();
    $('.default-value:input').live('focus', function() {
        if (!default_values[this.id]) {
            default_values[this.id] = this.value;
        }
        if (this.value == default_values[this.id]) {
            this.value = '';
            $(this).removeClass('default-value-inactive');
        }
        $(this).blur(function() {
            if (this.value == '') {
                $(this).addClass('default-value-inactive');
                this.value = default_values[this.id];
            }
        });
    });

    /*** Placeholder ***/
    get_script('input[placeholder]', 'jquery.placeholder.js', function(){
        $('input[placeholder]').placeholder();
    });

    /*** sticky ***/
    get_script('.sticky', 'jquery-contained-sticky-scroll-min.js', function(){
        $('.sticky').containedStickyScroll({
            duration: 300,
            unstick: true,
            closeChar: ''
        });
    });

    /*** kwicks ***/
    get_script('.kwicks', 'jquery.kwicks-1.5.1.js', function(){
        $('.kwicks').kwicks({
            min : 78,
            max : 700,
            spacing : 0
        });
    });

    /*** bxslider ***/
    /** @TODO use only .slider **/
    get_script('#slider, #slider_product, .ban-slider', 'jquery.bxSlider.min.js', function(){
        var mode = 'fade';
        var infiniteLoop = true;
        var auto = false;
        var controls = true;
        var pause = 3000;

        if ($('#slider').data('json')) {
            if ($('#slider').data('json').mode) mode = $('#slider').data('json').mode;
            if ($('#slider').data('json').infiniteLoop) infiniteLoop = $('#slider').data('json').infiniteLoop;
            if ($('#slider').data('json').auto) auto = $('#slider').data('json').auto;
            if ($('#slider').data('json').controls) controls = $('#slider').data('json').controls;
            if ($('#slider').data('json').pause) pause = $('#slider').data('json').pause;
        }
        var slider = $('#slider').bxSlider({
            mode: mode,
            infiniteLoop: infiniteLoop,
            auto: auto,
            controls: controls,
            pause: pause,
            nextText: '',
            prevText: ''
        });

        /* slider */
        $('.ban-slider').each(function() {
            if ($(this).data('json')) {
                if ($(this).data('json').mode) mode = $(this).data('json').mode;
                if ($(this).data('json').infiniteLoop) infiniteLoop = $(this).data('json').infiniteLoop;
                if ($(this).data('json').auto) auto = $(this).data('json').auto;
                if ($(this).data('json').controls) controls = $(this).data('json').controls;
                if ($(this).data('json').pause) pause = $(this).data('json').pause;
            }
            var slider = $(this).bxSlider({
                mode: mode,
                infiniteLoop: infiniteLoop,
                auto: auto,
                controls: controls,
                pause: pause,
                nextText: '',
                prevText: ''
            });
        });

        /* slider product **/
        var slider_product = $('#slider_product').bxSlider({
            mode: 'fade',
            infiniteLoop: true,
            auto: true,
            controls: false,
            pause: 8000
        });
        $('.thumbs a').click(function(){
            var thumbIndex = $('.thumbs a').index(this);
            slider_product.goToSlide(thumbIndex);
            $('.thumbs a').removeClass('pager-active');
            $(this).addClass('pager-active');
            return false;
        });
        $('.thumbs a:first').addClass('pager-active');
    });

    /*** mobilyselect ***/
    get_script('.mobilyselect', 'jquery.mobilyselect.js', function(){
        $('.mobilyselect').mobilyselect({
            collection: 'all', // shows specified collection on startup
            animation: 'fade', // type of animation, available options: plain, fade, absolute
            duration: 250, // duration of animation
            listClass: 'mobilyselect_content', // main container
            btnsClass: 'mobilyselect_button',
            btnActiveClass: 'active', // add class name to the button
            elements: 'li',
            onChange: function(){}, // call the function when collection changes
            onComplete: function(){ create_alpha_omega(); } // call the function when animation is completed
        });
    });

    /*** jplayer ***/
    get_script('.jp-jplayer', 'jquery.jplayer.min.js', function(){

        var playItem = 0;
        var tracks = new Array();

        // load a playlist from a playlist block with links inside
        //@TODO change hard url link....
        $('.playlist a').each(function() {
            tracks.push({name: $(this).text(), mp3: 'http://raffu.kewix.fr'+$(this).attr('href')});
        });

        // on click change track
        $('.playlist a').click(function(){
            playListChange($(this).index()/2);
            return false;
        });

        $('.jp-jplayer').each(function(){
            var id = $(this).attr('id');
            $('#'+id).jPlayer({
                ready: function () {
                    playListInit(false); // Parameter is a boolean for autoplay.
                },
                ended: function (event) {
                    playListNext();
                },
                swfPath: 'javascript',
                solution:"flash, html",
                supplied: 'mp3'
            })
        });

        // previous/next events
        $('.jp-prev').click(function() {
            playListPrev();
        });

        $('.jp-next').click(function() {
            playListNext();
        });

        function playListInit(autoplay) {
            if(autoplay) {
                playListChange( playItem );
            } else {
                playListConfig( playItem );
            }
        }

        //@TODO change hard #jquery_jplayer_1 to enable multi instance
        function playListConfig( index ) {
            $('.playlist a:eq('+playItem+')').removeClass("current");
            $('.playlist a:eq('+index+')').addClass("current");
            playItem = index;
            $("#jquery_jplayer_1").jPlayer('setMedia', (tracks[playItem]));
        }

        //@TODO change hard #jquery_jplayer_1 to enable multi instance
        function playListChange( index ) {
            playListConfig( index );
            $("#jquery_jplayer_1").jPlayer('play');
        }

        function playListNext() {
            var index = (playItem+1 < tracks.length) ? playItem+1 : 0;
            playListChange( index );
        }

        function playListPrev() {
            var index = (playItem-1 >= 0) ? playItem-1 : tracks.length-1;
            playListChange( index );
        }

    });

    /*** Autoselect ***/
    $('.autochecked').live('click', function(){
        $(this).find('input').attr('checked', 'checked');
    });

    /*** Find the first anchor in this block and change location ***/
    $('.firstanchor').live('click', function() {
        $(location).attr('href', $(this).find('a').attr('href'));
    });

    /*** Google maps ***/
    //get_script('.gmaps', Array('http://maps.google.com/maps/api/js?sensor=false&region=FR', 'http://maps.gstatic.com/intl/fr_ALL/mapfiles/api-3/4/11/main.js'), function(){

    $('.gmaps').each(function(){
        gmaps_initialize($(this).get(0), $(this).attr('rel'), $(this).attr('title'));
    });

    /*** Calcul prix TTC ***/
    $('.price_wot').each(function(){
        tax_price($(this), 'wt');
    });
    $('.price_wot').keyup(function(){
        tax_price($(this), 'wt');
    });
    $('.price_wt').keyup(function(){
        tax_price($(this), 'wot');
    });
    $('.tax').change(function(){
        tax_price($(this).parent().parent().find('.price_wot'), 'wt');
    });

    /*** cart ***/
    get_script('#cart, #widget_cart', 'cart.js', function(){
        // nothing to do here, see cart.js
    });

    /*** acl ***/
    $('input[name=checkcont]').each(function() {
        acl_checkbox($(this), false);
    });

    $('input[name=checkmodule]').each(function() {
        acl_checkbox($(this), true);
    });

    /*** unload catcher ***/
    /*$('.unload_catcher').each( function() {
        unload_catcher();
    });

    $('.btn_save, .btn_savenstay, .btn_cancel').click( function() {
        $(window).unbind('beforeunload', catcher);
    });*/

    /*** mask **/
    get_script('.mask', 'jquery.maskedinput.js', function(){
        $('.mask.date').live('focus', function() {
            $(this).mask('99/99/9999', {
                placeholder: " "
            });
        });
    });

    /*** slider ***/
    get_script('.slider', 'jquery-ui/jquery-ui-1.8.14.custom.min.js', function(){
       $( ".slider" ).slider({
            value: $( ".slider_value" ).val(),
            min: 0,
            max: 100,
            step: 10,
            slide: function( event, ui ) {
                $( ".slider_value" ).val(ui.value);
                $( ".slider_info" ).html(ui.value);
            }
        });
        $( ".slider_value" ).val($( ".slider" ).slider( "value" ));
        $( ".slider_info" ).html($( ".slider" ).slider( "value" ));
    });

    /*** tipsy ***/
    get_script('a[title], img[title], span[title]', 'jquery.tipsy.js', function(){
         get_css('tipsy.css');
         $('a[title]').tipsy({gravity: $.fn.tipsy.autoWE});
         $('img[title]').tipsy({gravity: $.fn.tipsy.autoWE});
         $('span[title]').tipsy({gravity: $.fn.tipsy.autoWE});
    });

    /*** tinymce ***/
    /*get_script('.mceEditor', ['tiny_mce/tiny_mce.js', '/tinymce', 'tiny_mce/plugins/tinybrowser/tb_tinymce.js.php'], function(){
    });*/

    /*** tabulation ***/
    /*** ATTENTION ceci doit toujours être le dernier script appelé ***/
    get_script('#usual ul', 'jquery.idTabs.min.js', function(){
        var tab = $.getUrlVar('tab');
        if (tab)
            $("#usual ul").idTabs(tab);
        else
            $("#usual ul").idTabs();
    });
});

