
/**
 * Handles add, edit, delete of list items and generate properiate
 * fields so that is can be saved
 */
var global_tab_index = null;
var ListRow = {
    delimiter: ":::",
    edit_row_obj: null,
    making_heavy_use_of: global_tab_index,
    mem_json: null,
    mem_json_industries: null,
    mem_json_challenges: null,
    mem_json_arr: [[],[],[]],
    
    /**
     * Event - When hitting enter on text field
     */
    on_enter_facade: function(e, row_type) {
        if( e && e.keyCode == 13 ){
            if( row_type == "challenge"){
                return ListRow.add_challenge_row();
            } else {
                return ListRow.add_item_row();
            }
            
        }
        return true;
    },

    
    /**
     * Handle memory of the rows.
     * Manage the JSON object.
     */
    memory: {
        
        /**
         * Save the json to a text field
         */
        update_field: function(tab){
            var json_txt = ListRow.jsonToString( ListRow.mem_json_arr[tab] );
            $j('#id_memory_'+ tab +'_items').val( json_txt );
            return false;
        },


        /**
         * JSON - ADD or EDIT the json string
         * These are optional: url, role_id, industry_id
         */
        add_edit_item_json: function(text_val, object_id, tab, url, role_id, industry_id, sort_order){
            
            // Trying with EDIT, searching for existing.
            for(i in ListRow.mem_json_arr[tab] ){
                if( ListRow.mem_json_arr[tab][i].object_id == object_id){
                    // Found row in json DB, use this....
                    //console.debug( "Found row in json DB, use this...." );
                    ListRow.mem_json_arr[tab][i].object_data = text_val;
                    
                    if(url){
                        ListRow.mem_json_arr[tab][i].url = url;
                    }
                    if(role_id){
                        ListRow.mem_json_arr[tab][i].role_id = role_id;
                    }
                    if(industry_id){
                        ListRow.mem_json_arr[tab][i].industry_id = industry_id;
                    }
                    return ListRow.memory.update_field(tab);
                }
            }
            //... item didnt exist in json, continue with normall ADD
            
            if( ! ListRow.mem_json_arr[tab]) {
                // First timer, initialize it...
                ListRow.mem_json_arr[tab] = [];
            }
            
            if( url != null) {
                // For challenges
                //console.debug(" im adding a challenge to the memory");
                
                var new_line = {"object_id":object_id, "object_data": text_val, "sort_order":sort_order,
                                "url":url, "role_id":role_id, "industry_id":industry_id};
            } else {
                // Adding the new row - Normal
                var new_line = {"object_id":object_id, "object_data": text_val, "sort_order":sort_order};
            }

            ListRow.mem_json_arr[tab].push( new_line );
            ListRow.memory.update_field(tab);
        },
        
        /**
         * When onload, try to load the rows from memory
         *
         */
        init_from_memory: function(){
            ListRow.mem_json_arr = [[],[],[]];

            
            for(var i=0;i < ListRow.mem_json_arr.length; i++){
                var mem = $j('#id_memory_'+i+'_items').val();

                
                if(mem != ""){
                    try {
                        ListRow.mem_json_arr[i] = eval(mem);
                    } catch(e){
                        ListRow.mem_json_arr[i] = [];
                    }
                } else {
                    ListRow.mem_json_arr[i] = [];
                }
            }

            
            for(tab in ListRow.mem_json_arr){
                for(i in ListRow.mem_json_arr[tab]){
                    var item = ListRow.mem_json_arr[tab][i];

                    ListRow.add_row(item.object_id, item.object_data, item.desc, item.url, item.role_id, item.industry_id, item.sort_order, tab);
                }
            }
        }
    
    },
    
    sorting: {
        /**
         * Get the last sort index... for new rows..
         */
        get_next_sort_index: function(){
            var list_with_sort_indexes = []; // list where the numeric ids will be stored and later sorted
        
            for(i in ListRow.mem_json_arr[global_tab_index] ){
                var item = ListRow.mem_json_arr[global_tab_index][i];
                list_with_sort_indexes.push( parseInt(item.sort_order) );
            }
            if( list_with_sort_indexes.length > 0) {
                list_with_sort_indexes.sort( ListRow.number_ordering_desc );
                return ++list_with_sort_indexes[0];
            } else {
                return 1;
            }
        },
        
        /**
         *
         */
        update_json_sort_order: function(object_id1, new_sort1, object_id2, new_sort2, tab){
            for(i in ListRow.mem_json_arr[tab] ){
                if( ListRow.mem_json_arr[tab][i].object_id == object_id1){
                    ListRow.mem_json_arr[tab][i].sort_order = new_sort1;
                }
                if( ListRow.mem_json_arr[tab][i].object_id == object_id2){
                    ListRow.mem_json_arr[tab][i].sort_order = new_sort2;
                }
            }
            return ListRow.memory.update_field(tab);
        }

    },
    
    /**
     * JSON DELETE
     */
    remove_item_json: function(object_id){
        for(i in ListRow.mem_json_arr[global_tab_index]){
            if( ListRow.mem_json_arr[global_tab_index][i].object_id == object_id){
                delete ListRow.mem_json_arr[global_tab_index][i];
            }
        }
        var json_txt = ListRow.jsonToString( ListRow.mem_json_arr[global_tab_index] );


        $j('#id_memory_'+global_tab_index+'_items').val( json_txt );
    },
    
    jsonToString: function(json){
        var str_buffer = "[";
        for(id in json){
            var o = json[id];
            
            str_buffer += '{"object_id":"'+o.object_id+'",'
            
            //if( o.object_data ){
            str_buffer += '"object_data":"'+o.object_data+'",'
            
            
            if(o.url || o.role_id || o.industry_id){
                // When fields for challenges were found..
                str_buffer += '"url":"'+o.url+'",'
                str_buffer += '"role_id":"'+o.role_id+'",'
                str_buffer += '"industry_id":"'+o.industry_id+'",'
            }
            
            str_buffer += '"sort_order":"'+o.sort_order+'"'
            str_buffer += '},';
        }
        str_buffer = str_buffer.substring(0, str_buffer.length-1);
        str_buffer = str_buffer + "]"
        
        return str_buffer;
    },
    
    /**
     * Sorting callback function... used by get_new_id()
     */
    number_ordering_desc: function(a, b){
        return (b-a);
    },
    
    /**
     * Get a new valid ID for new rows
     */
    get_new_id: function(){
        var list_with_ids = []; // list where the numeric ids will be stored and later sorted
        
        for(i in ListRow.mem_json_arr[global_tab_index] ){
            var item = ListRow.mem_json_arr[global_tab_index][i];
            list_with_ids.push( parseInt(item.object_id) );
        }
        if( list_with_ids.length > 0) {
            list_with_ids.sort( ListRow.number_ordering_desc );
            return ++list_with_ids[0];
        } else {
            return 1;
        }
    },
    
    
    /**
     * Add a new row OR Edit existing
     *
     */
    add_item_row: function(persistant_id){
        $j('#id_tainted').val(1);
        
        var field_val = $j('#id_'+global_tab_index+'_name').val();


        if( ListRow.edit_row_obj ){
            // EDIT    
            $j( ListRow.edit_row_obj.children("td")[0] ).html( field_val );
            //console.debug("EDITING item row. object_id: " + ListRow.edit_row_obj.attr("object_id") );
            var object_id = ListRow.edit_row_obj.attr("object_id");
            ListRow.memory.add_edit_item_json(field_val, object_id, global_tab_index, null, null, null);
            ListRow.edit_row_obj = null;
        } else {
            // ADD
            var new_id = ListRow.get_new_id();
            var next_sort = ListRow.sorting.get_next_sort_index();
            
            var desc = '';
            ListRow.add_row( new_id, field_val, desc, '', '', '', next_sort);
            item_count++;

            ListRow.memory.add_edit_item_json(field_val, new_id, global_tab_index, null, null, null, next_sort);
        }

        // Reset name input form
        $j('#id_' + global_tab_index + '_name').val('');

        return false;
    },
    
    /**
     * Add a NEW row visually..
     */
    add_row: function(object_id, data, desc, url, role_id, industry_id, sort_order, tab){
        if( ! tab) {
            tab = global_tab_index;
        }

        
        $new_row = $j('#id_row_ref_' + tab).clone();
        
        $new_row.attr("id","id_row_" +tab+ "_" + object_id);
        $new_row.attr("object_id", object_id);
        $new_row.attr("sort_order", sort_order);
        $new_row.show();
        
        $j( $new_row.find("td")[0] ).html( data );
        $j( $new_row.find("td")[1] ).html( desc );
        
        // For challenges...
        if(url != ""){
            $new_row.attr("url", url);
        }
        if(role_id > 0){
            $new_row.attr("role_id", role_id);
        }
        if(industry_id > 0){
            $new_row.attr("industry_id", industry_id);
        }
        
        $j('#id_'+ tab +'_list table tbody').append( $new_row );

    },
    
    add_challenge_row: function(){
        $j('#id_tainted').val(1);
        
        var challenge_name = $j('#id_'+global_tab_index+'_name').val();
        var url = $j('#id_url_name').val();
        var role_id = $j('#id_role_selector').val();
        var industry_id = $j('#id_industry_selector').val();
        
        
        if( ListRow.edit_row_obj ){
            // EDIT    
            $row = ListRow.edit_row_obj;
            
            // Get a hold of the existing object_id, important
            var object_id = $row.attr("object_id");
            var next_sort = $row.attr("sort_order");
        } else {
            
            // ADD a new challenge
            var object_id = ListRow.get_new_id();
            var next_sort = ListRow.sorting.get_next_sort_index();
            
            $row = $j('#id_row_ref_' + global_tab_index).clone();
            $row.attr("id","id_row_" +global_tab_index+ "_" + (item_count++));
            $row.attr("object_id", object_id);
            $row.attr("sort_order", next_sort);
            

            $row.show();
            $j('#id_'+global_tab_index+'_list table tbody').append( $row );
        }
        
        ListRow.memory.add_edit_item_json(challenge_name, object_id, global_tab_index, url, role_id, industry_id, next_sort);
        
        $row.attr("url",url);
        $row.attr("role_id", role_id);
        $row.attr("industry_id", industry_id);
        $row.attr("sort_order", next_sort);
        $j( $row.find("td")[0] ).html( challenge_name );
        $j( $row.find("td")[0] ).attr('title', url);

        
        // Reset
        $j('#id_'+global_tab_index+'_name').val('');
        $j('#id_url_name').val('');
        $j('#id_role_selector').val('');
        $j('#id_industry_selector').val('');
        return false;
    },

    /**
     * Just load the values to the form visually
     * and set the global edit object
     */
    edit_challenge_row: function(obj){
        $j('#id_tainted').val(1);
        
        $edit_row_obj = $j($j( $j( obj ).parent('td')).parent('tr'));
        
        var challenge_title = $j( $edit_row_obj.children('td')[0] ).text();
        
        var url = $edit_row_obj.attr("url");
        var role_id = $edit_row_obj.attr("role_id");
        var industry_id = $edit_row_obj.attr("industry_id");
        
        $j('#id_url_name').val( url );
        
        if( role_id > 0){
            $j('#id_role_selector').val( role_id );
        } else {
            $j('#id_role_selector').val("");
        }
        if( industry_id > 0){
            $j('#id_industry_selector').val( industry_id );
        } else {
            $j('#id_industry_selector').val("");
        
        }
        
        $j('#id_2_name').val( challenge_title );
        $j('#id_2_name').select();
        
        ListRow.edit_row_obj = $edit_row_obj; // storing this in overall object
        
        return false;
    },
    
    
    /**
     * Just load the values to the form
     * and set the global edit object
     */
    edit_row: function(obj){
        $j('#id_tainted').val(1);
        
        $edit_row_obj = $j($j( $j( obj ).parent('td')).parent('tr'));
        var title = $j( $edit_row_obj.children('td')[0] ).text();
        
        ListRow.edit_row_obj = $edit_row_obj; // storing this in overall object
        
        $j('#id_'+global_tab_index+'_name').val( title );
        $j('#id_'+global_tab_index+'_name').select();
        
        return false;
    },
    
    /**
     * Delete
     */
    delete_row: function(row_obj){
        $j('#id_tainted').val(1);
        
        var parent_oid = $j('#id_id').val();
        var parent_id = parent_oid.split("-");
        parent_id = parent_id[1];
        
        var object_id = $j($j( $j( row_obj ).parent('td')).parent('tr')).attr('object_id');
        var object_type = global_tab_index;
        
        if( parent_id && object_id) {
            var url = "?get=lean_widget&action=delete_value&parent_id=" + parent_id
            + "&object_id=" + object_id
            + "&object_type=" + object_type;
            
            $j.getJSON(url, function(resp){
                //console.debug( resp );
            
            });
        }

        ListRow.remove_item_json(object_id);
        
        $j($j( $j( row_obj ).parent('td')).parent('tr')).remove();
    },
    
    /**
     * Handles moving and sorting
     */
    moving: {
        
        /**
         * Move actual row visually
         */
        move_row: function(row_obj, direction){
            $j('#id_tainted').val(1);
            var $tr = $j($j( $j( row_obj ).parent('td')).parent('tr'));
        
            if(direction == 'up'){
                var sort_order_switch = $tr.prev().attr('sort_order');
                var sort_order_curr = $tr.attr('sort_order');
                
                $tr.attr('sort_order', sort_order_switch);
                $tr.prev().attr('sort_order', sort_order_curr);
                
                ListRow.sorting.update_json_sort_order( $tr.attr('object_id'), sort_order_switch, $tr.prev().attr('object_id'), sort_order_curr, global_tab_index );
                
                $j($tr.prev()).before( $tr );
            } else {
                
                var sort_order_switch = $tr.next().attr('sort_order');
                var sort_order_curr = $tr.attr('sort_order');
                
                $tr.attr('sort_order', sort_order_switch);
                $tr.next().attr('sort_order', sort_order_curr);
                
                ListRow.sorting.update_json_sort_order( $tr.attr('object_id'), sort_order_switch, $tr.next().attr('object_id'), sort_order_curr, global_tab_index );

                $j($tr.next()).after( $tr );
            }
            
            ListRow.moving.check_ends();

            return false;
        },
        
        
        /**
         * Iterate all rows and check with who is first and last.
         * Ie: To hide down btn for last item ..
         */
        check_ends: function(){
            $j('#id_'+global_tab_index+'_list table tbody tr td a').show();
            var nr_rows = $j('#id_'+global_tab_index+'_list table tbody tr').length;
            $j( $j( $j('#id_'+global_tab_index+'_list table tbody tr').get(nr_rows-1)).find('a').get(3)).hide();
        }
    
    }
}


/**
 * Handles add, edit, delete of list items and generate properiate
 * fields so that is can be saved
 */
var Chooser = {
    choosen_role_id: null,
    choosen_industry_id: null,
    challenges_matrix: null,
    choosen_role: null,
    choosen_industry: null,
    
    show_next: function(obj, current_index){
        // Resetting
        $j( $j('.chooser_wrapper .chooser_box')[2]).hide();
        $j(obj).parents('.chooser_box_inner').find('a').css({'color':'', 'font-weight':'normal', 'background-color':''});
        
        $j(obj).parents('.chooser_box_inner').find('div').css('background-color','');

        if( current_index == 0){
            $j('.chooser_wrapper .chooser_box .chooser_box_inner .chooser_box_row').css('background-color','');
        
            Chooser.choosen_industry_id = $j(obj).attr('object_id');
            Chooser.choosen_industry = jQuery.trim($j(obj).text());
            $j( $j('.chooser_wrapper .chooser_box')[1]).children('.chooser_box_inner').find('a').css({'color':'', 'background-color':''});
        }
        
        $j(obj).css('color','#FFF');
        $j(obj).css('font-weight','bold');
        

        $j(obj).children('.chooser_box_row').css('background-color','#73B64C');

        
        $j(obj).parents('.chooser_box').show();
        $j( $j(obj).parents('.chooser_box') ).next().show();
        
        
        if( current_index == 1){
            // Time to present the challenges, with build index
            //Chooser.choosen_industry_id = $j(obj).attr('object_id');
            //Chooser.choosen_industry = jQuery.trim($j(obj).text());
            Chooser.choosen_role_id = $j(obj).attr('object_id');
            Chooser.choosen_role = jQuery.trim($j(obj).text());
            
            
            var choosen_index = Chooser.choosen_role_id+"-"+Chooser.choosen_industry_id;

            var challenge_list = Chooser.challenges_matrix[choosen_index];
            
            // Resettting the challenge div content...
            $j('#id_dynamic_content').html("");
            
            if(challenge_list){
                //console.debug( "Längd på vald lista: " + challenge_list.length );
                
                // OUTPUT the challenges content to the div
                for(var i=0;i < challenge_list.length; i++){
                    var challenge = challenge_list[i];

                    var url = '/?get=lean_widget&action=chooser&role='
                    + escape(Chooser.choosen_role)+'&industry='
                    + escape(Chooser.choosen_industry)+'&challenge='
                    + challenge.name + '&to=' + escape(challenge.url);
                    
                    var html = '';
                    //html += '<a href="'+url+'"><div class="chooser_box_row" title="' + challenge.label + '">';
                    html += '<a href="'+url+'" onClick="recordOutboundLink(this, \'Choosen challenge\', \''+challenge.name+'\'); window.open(this.href); return false;"><div class="chooser_box_row" title="' + challenge.label + '">';
                    
                    html += challenge.name;
                    html += '</div></a>';
                    
                    $j('#id_dynamic_content').append( html );
                    //$j( $j('.chooser_wrapper .chooser_box')[2]).children('.chooser_box_inner').append( html );
                }
            }
        }
        return false;
    },
    
    reset_boxes: function(){
        $j('.chooser_wrapper .chooser_box .chooser_box_inner').find('a').css({'color':'', 'font-weight':'normal'});
        
        $j( $j('.chooser_wrapper .chooser_box')[1]).hide();
        $j( $j('.chooser_wrapper .chooser_box')[2]).hide();
        
        $j('.chooser_wrapper .chooser_box .chooser_box_inner .chooser_box_row').css('background-color','');
        
        Chooser.choosen_role = "";
        Chooser.choosen_industry = "";
    }
}


$j(document).ready(function(){
    
    if( $j('.chooser_wrapper .chooser_box').length > 0 ){

        
        $j( $j('.chooser_wrapper .chooser_box')[1]).hide();
        $j( $j('.chooser_wrapper .chooser_box')[2]).hide();
        
        
        $j('.chooser_wrapper').css('overflow','hidden');
        $j('.chooser_wrapper').css('height','40px');
    }

    $j('.chooser_wrapper').hover(

        //function on mouse over
        function(){
            $j('.chooser_box_inner').css('overflow','auto');

            $j(this)
                .stop()
                .animate({"height":"270px", "margin-top":"-306px"}, 300);
        },

        //function on mouse out
        function(){
            $j(this)
                .stop()
                .animate({"height" : "40px", "margin-top":"-64px"}, 400);
        	
            Chooser.reset_boxes();
            $j('.chooser_box_inner').css('overflow','hidden');
        }
    );

});



