
// external functions for legacy calls
var open_vfolder;
var refresh_vfolder;
var refresh_vfolders;

(function() { // begin writing extension methods here

    jQuery.sessionId = function() {
        //var search = window.location.search.replace('?', '');
	if (document.forms[0]._session !== undefined) {
		return document.forms[0]._session.value;
	}

        var search = window.location.search.replace('?', '');

        var result = /_session=(.*?)(&|$)/.exec(search)[1];

	if (document.forms[0] !== undefined && document.forms[0]._session !== undefined)
		result = document.forms[0]._session.value;

        return result; //result && result[1];
    };

    jQuery.isInView = function(el) {
        var top = el.offsetTop || 0;
        var left = el.offsetLeft || 0;
        var width = el.offsetWidth || 0;
        var height = el.offsetHeight || 0;

        while(el.offsetParent) {
            el = el.offsetParent;
            top += el.offsetTop;
            left += el.offsetLeft;
        }

        return (
            top >= window.pageYOffset &&
                left >= window.pageXOffset &&
                (top + height) <= (window.pageYOffset + window.innerHeight) &&
                (left + width) <= (window.pageXOffset + window.innerWidth)
        );
    };

    jQuery.fn.scrollTo = function(always) {
        this.eq(0).each(function() {
            if (always || !jQuery.isInView(this)) {
                window.scrollTo(0, $(this).position().top);
            }
        });

        return this;
    };

    // ----------------- vtree ------------------

    // NEW STUFF
    var queue = new Array();
    refresh_vfolders_queue = function (folder_arr) {
        queue = folder_arr;
        queue.reverse();
        $('li span.highlighted').removeClass('highlighted');
        refresh_vfolder_queue();
    }

    refresh_vfolder_queue = function () {
        if (queue.length > 0) {
            var id_path = queue.pop();
            var id = id_path[0];
            var path = id_path[1];
            $('#fo'+id).vtree(path, null, false);
            //$('#fo'+id).find('span #fo'+id+':parent').removeClass('highlighted');
            if (queue.length === 0) {
                $('#fo'+id).parent().find('span').addClass('highlighted');
            }
        }
    }
    // END NEW STUFF

    var plusIconSrc = '/lncore/icons/bullet_toggle_plus.png';
    var minusIconSrc = '/lncore/icons/bullet_toggle_minus.png';

    jQuery.fn.toggleControl = function(control) {
        if ($(this).is(':visible')) {
            $(control).attr('src', plusIconSrc);
            $(this).hide();
        } else {
            $(control).attr('src', minusIconSrc);
            $(this).show();
        }
    };

    var launchItem = function(params) {

        var frame = window.top.document.getElementById("main");
        if (frame) {
            frame.src = null;
            params._session = $.sessionId();

            var url = window.location.href.replace(/\?.*$/, '') + '?' + $.param(params);
            frame.src = url;
        } else {
        alert("no frame");
    }
    };

    refresh_vfolder = function(id) {
        open_vfolder(id);
    };

    var sendEachTo = function(f) { return function(list) { for (var k in list) { f(list[k]); } } }
    refresh_vfolders = sendEachTo(refresh_vfolder);
    open_vfolder = function(folder_id) {

    //~ sync_r = false;
    var id = '#fo' + folder_id;
    $('li span.highlighted').removeClass('highlighted');
    //~ alert("opening folder: "+id)
    //~ alert("path: "+$(id).data('path'));
    // Surpressing errors.
    if ($(id)) {
        $(id).vtree().parent().find('span :first').addClass('highlighted');
    }


    };

    jQuery.fn.vtree = function(inPath, onSelect, first, project) {
        // normalise path
        // path can be assumed to end with a single slash
        var path;
        if (inPath == null) {
            path = $(this).data('path');
        //~ alert("there was no path in the args: " + path);
        } else {
            path = (inPath + '/').replace(/\/+/g, '/');
        }

        // Prevent the vtree bug
        // Still doesn't sync the tree.
        if (path == undefined) {
            return;
        }

        $(this).data('path', path);
    //~ alert("SET PATH1: " + $(this).attr("id") + "   " + path)

        var thisTree = $(this);
        thisTree.empty();
        thisTree.addClass('inline');
        var loadingIndicator = $('<img src="/lncore/images/ajax-loading-arrows.gif"/>');
        thisTree.append(loadingIndicator);
        var handleResponse = function(data) {
    //~ alert("wait")
            loadingIndicator.remove();
            thisTree.removeClass('inline');
            $.each(data, function(index, datum) {
                var id = (datum.type == 'folder' ? 'fo' : 'fi') + datum.id;
                var node = $("<li></li>");
                var label = $("<img src='/lncore/icons/"+datum.icon+".png' /><span class='"+datum.type+"'>" + datum.name + "</span>");
        if (first)
            var itemPath = path //(first ? '/' : path) + datum.name.replace('/', '\\\\');
        else
            var itemPath = path + datum.name.replace('/', '\\\\');

        //~ alert("path: "+path);
        $(this).data('path', itemPath);
                label.click(function() {
                    if (onSelect) {
                        onSelect(itemPath);
                    } else {
                        $('li span.highlighted').removeClass('highlighted');
                        $(this).addClass("highlighted");
                        launchItem({ verb: 'open', type: datum.type == 'folder' ? 'vfolder' : 'vfile', id:id, project:datum.project?datum.project : ''});
                    }
                });
        var title = "path: " + itemPath + "   ;    id: " + id;
                if (datum.type == 'folder') {
                    //var control = $('<img class="tree-control" src="'+plusIconSrc+'" title="'+title+'"/>');
            var control = $('<img class="tree-control" src="'+plusIconSrc+'" />');
                    node.append(control);
                    node.append(label);

                    var subTree = $('<ul id="'+id+'"></ul>');
            //alert("subTree"+'<ul id="'+id+'"></ul>');
                    control.click(function() {
                        control.attr('src', minusIconSrc);
            if(datum.islink)
                itemPath = "/projects/" + datum.project + "/";
                        subTree.vtree(itemPath, onSelect, false, datum.project?datum.project : '');
            //alert(datum.project)
                        control.unbind('click');
                        control.click(function() { subTree.toggleControl(control); });
                    });

                    node.append(subTree);
                } else {
                    node.append(label);
                }

                thisTree.append(node);
                if (first) {
                    node.children('span').trigger('click');
                }
            });
        return 'done'

            refresh_vfolder_queue();
        }

        var baseUrl = document.location.href.replace(/\?.*/, '');
    //~ alert("path3: "+ path);
    //~ alert("baseUrl" + baseUrl + "_session:$.sessionId(): " + $.sessionId());

        $.getJSON(baseUrl, { _session:$.sessionId(), verb:'ls', path:path, first:first, project:project }, handleResponse);
        return this;
    };

    // ---------------- autocomplete -----------------

    var createMenuBelow = function(el) {
        var top = el.position().top + el.height() + 5;
        var left = el.position().left;
        return $(document.createElement('div'))
            .addClass('ajaxMenu')
            .css('top', top + 'px')
            .css('left', left + 'px')
    }

    var selectMenuItem = function() {
        $(this).siblings().removeClass('selected').end().addClass('selected');
    }

    jQuery.fn.makeAutoComplete = function(url, key, autosubmit, grid, columns) {
        //console.warn('makeAutoComplete');

        // alert('makeAutoComplete');
        var input = this;
        var menu;
        var timeout;

        var clear = function() {
            window.clearTimeout(timeout);
            if (menu) {
                menu.remove();
                menu = undefined;
            }
        }

        input.keydown(function(e) {
            //console.info('input.keydown');

    if (!grid) {
            if (!menu) {
                return;
            }

            var code = e.which;

            var selected = menu.find('.selected');
            // 38 = up, 40 = down
            var next = (code == 38 ? selected.prev() : (code == 40 ? selected.next() : undefined));

            if (next && next.length > 0) {
                selected.removeClass('selected');
                next.eq(0).addClass('selected');
            } else if (code == 13) { // enter
                input.val((selected.text()));
        if (autosubmit == 1)
            document.forms[0].submit();
                e.preventDefault();
                clear();
            } else if (code == 9) { // tab
                clear();
            }
    } else {
        $(this).trigger('keyup_special', [e.keyCode]);
    }


    return;

        });

        input.keyup(function(e) {
            //console.info('input.keyup');

            var code = e.which;
        //if (!grid) {
            if (code == 13 || code == 40 || code == 38)
            return;
        //}

            clear();

            var val = $.trim(input.val());

            if (val == '')
                return;

            var search = function() {
            //console.info('search');
                // alert('In search');

                $.get(url, {'_id': key, val: input.val(), verb: 'pa', '_a': 'ajax_lookup'}, function(data, status) {
                    // alert('data: '+data);
                    if (grid) {
                        db_grid3.autocomplete(input, data, columns, code);
                    } else {
                        clear();
                        menu = createMenuBelow(input);
                        var elements = eval('(' + data + ')');

                        if (menu && elements && elements.length > 0) {
                            //for (var ii = 0; ii < elements.length && ii < 10; ii++) {
                for (var ii = 0; ii < elements.length; ii++) {
                                var str = elements[ii].toString();
                                var pat = new RegExp('(' + val + ')', 'i');
                                var display = str.replace(pat, '<span class="autocomplete_match">$1</span>');

                                menu
                                    .append($('<div><a href="#">' + display + '</a></div>')
                                            .click(function() {
                                                input.val($(this).text());
                            if (autosubmit == 1)
                            document.forms[0].submit();
                                                clear();
                                            })
                                            .mouseover(selectMenuItem)
                                           )
                                    .mouseover(function() {
                                        input.unbind('blur');
                                    })
                                    .mouseout(function() {
                                        input.blur(function() { clear() });
                                    })
                            }

                            menu.find('div:first').addClass('selected');

                            $('body').append(menu);
                        }
                    }
                });
            }

            ajaxTimeout = window.setTimeout(search, 500);
        return false;
        });

        input.blur(clear);

        return jQuery;
    }

    jQuery.fn.matrix = function() {
        var matrix = this;
        var id = this.attr('id');

        var rowId = function(n) { return id + '-row-' + n; };
        var colId = function(n) { return id + '-col-' + n; };
        var cellId = function(row, col) { return id + '-cell-' + row + '-' + col; };

        this.find('.add-col').remove();
        this.find('.add-row').remove();

        var addCol = $('<button class="add-col">+</button>');
        addCol.click(function() {
            var rows = matrix.find('tr:not(:first)');
            var colNum = matrix.find('tr:first').find('td:not(:first)').length + 1;

            matrix.find('tr:first').append($('<td><input name="' + colId(colNum) + '" /></td>'));
            var rowNum = 1;
            rows.each(function() {
                $(this).append($('<td><input name="'+cellId(rowNum, colNum)+'" type="checkbox" /></td>'));
                rowNum++;
            });
            matrix.matrix();
        });

        var addRow = $('<button style="display:block;" class="add-row">+</button>');
        addRow.click(function() {
            var colCount = matrix.find('tr:first').find('td:not(:first)').length;
            var n = $('tr:not(:first)').length + 1;
            var row = $('<tr><td><input name="'+rowId(n)+'" /></td></tr>');
            for (var ii = 0; ii < colCount; ii++) {
                row.append($('<td><input name="'+cellId(n, ii + 1)+'" type="checkbox" /></td>'));
            }
            matrix.find('table').append(row);
            matrix.matrix();
        });

        this.find('table tr:first td:last').append(addCol);
        this.find('table tr:last td:first').append(addRow);
    };

    // enable matrix editors
    $(function() {
        var matrices = $('.matrix-editor');
        if (matrices.length > 0) {
            matrices.matrix();
        }
    });

    // enable sortable lists
    $(function() {
        var sorts = $('.sortable');
        if (sorts.length > 0) {
            sorts.sortable({
                placeholder: 'ui-state-highlight',
                forcePlaceholderSize: true,
                update: function(event, ui) {
                    var orderStr = '';
                    $(this).find('> .sortable-item').each(function() {
                        orderStr = orderStr + (orderStr == '' ? '' : ';') + $(this).attr('id');
                    });
                    $(this).find('> input').val(orderStr);
                }
            });
        }
    });

    // enable worker status updaters
    jQuery.fn.statusIndicator = function(url, message, autoSubmit, max) {
        var myself = this;
        var parent_form = null;
    var clock = 0
        var check = function(data) {
            $.getJSON(url, { 'verb':'pa', '_a':'update', '_id':$(myself).attr('id') }, function(data) {
            clock = clock + 1000;

                if (data.status == 'done') {
                    parent_form = $(myself).closest('form');
                    $(myself).replaceWith($('<div>'+(message || 'Task completed')+'</div>'));
                    if (autoSubmit) {
            //alert("autosubmit1");
            $('#'+$(myself).attr('id') + "_status").attr("value", "completed");
            //alert("autosubmit2");
                        //$('form').submit();
            //$(myself).closest("form").submit();
            /*if (document.forms[1])
                document.forms[1].submit();
            else
                document.forms[0].submit();*/
            //$(myself).closest('form').trigger('submit');
            //window.console.log($(myself).closest('form'));
            //window.console.log($(myself));
            //eval($(myself).closest('form').attr('onsubmit'));
            //ajax.send_auto_request('frm_section2', 'section2');
            /*window.console.log($(myself));
            window.console.log($(myself).parents('form'));
            window.console.log($('form'));
            $('form').each(function (index) {
                var $this = $(this);
                window.console.log($this.children('div.worker-status-indicator'));
                if ($this.children('div.worker-status-indicator').size() > 0) {
                    $this.trigger('submit');
                }
            });*/
            if (typeof(ajax)==='undefined') {
                $('form').submit();
        } else {
                var eval_str = parent_form.attr('onsubmit');
                eval_str = eval_str.replace('return', '');
                eval(eval_str);
            }
            //$(myself).parents('form').trigger('submit');

                    }
                } else if (data.status == 'error') {
                    $(myself).replaceWith($('<div><strong>There was an error completing this task: '+data.message+'</strong></div>'));
            if (autoSubmit) {
            $('#'+$(myself).attr('id') + "_status").attr("value", "error");
                        $('form').submit();
                    }
                } else {
            if (clock < max)
                t = setTimeout(check, 1000);
            else
            {
                $('#'+$(myself).attr('id') + "_status").attr("value", "timeout");
                $('form').submit();
            }
                }
            });
        };
        var t = setTimeout(check, 1000);
    };

    $(function() {
        var picker = $('select.add-part-picker');
        if (picker.length > 0) {
            picker.change(function() {
                var val = $(this).val();
                $("input[name='selected_action']").val(val);
                $("input[name='command']").val('add');
                $('form').eq(0).submit();
            });
        }
    });


    resize_dialog = function(w, h) {
        //$('#dialog').dialog('option', 'height', w);
        //$('#dialog').dialog('option', 'width', h);
        // $('#dialog').parents('.ui-dialog:first').animate({width: w}, 1000);
        $('#dialog').parents('.ui-dialog:first').animate({height:h, width:w});
        $('#dialog').css('width', '100%');
        $('#dialog').css('height', '100%');
        $('#dialog').attr('width', '100%');
        $('#dialog').attr('height', '100%');
    };

    submit = function() {
        $('#theform').submit()
    }

    $(function() {
        var picker = $('select.add-part-picker');
        if (picker.length > 0) {
            picker.change(function() {
                var val = $(this).val();
                $("input[name='selected_action']").val(val);
                $("input[name='command']").val('add');
                $('form').eq(0).submit();
            });
        }
    });

})();

$(function() {


    function get_session_url()
    {
        var loc = window.location + '';
        var parts = loc.split('?');

        var base = parts[0];

        vars = parts[1].split('&');

        if (!base) base = loc;

        return base + '?'+vars[0];
    }

    function openlnet($item, name)
    {
        //window.open(get_session_url() + '&verb=openlnet&type=vfile&id=' + pid)
        //viewLargerImage(get_session_url() + '&verb=openlnet&type=vfile&id=' + pid);

        var token = 1;
        if($('#_token').size() > 0){token = $('#_token').attr('value')}

        if(name)
        {
            var title = name? name : "";
            if($item.attr("oWidth"))
                var oWidth = $item.attr("oWidth")? $item.attr("oWidth") : "550";
            if($item.attr("oHeight"))
                var oHeight = $item.attr("oHeight")? $item.attr("oHeight") : "500";
            var src = get_session_url() + '&verb=openlnet&type=vfile&id=' + $item.attr("name") + '&token='+token;
        }else
        {
            if($item.attr("name"))
                var title = $item.attr("name")? $item.attr("name") : "";
            if($item.attr("target"))
                var target = $item.attr("target")? $item.attr("target") : "";
            if($item.attr("oWidth"))
                var oWidth = $item.attr("oWidth")? $item.attr("oWidth") : "550";
            if($item.attr("oHeight"))
                var oHeight = $item.attr("oHeight")? $item.attr("oHeight") : "500";

            var src = get_session_url() + '&verb=openlnet&type=vfile&id=' + $item.attr("href")+ '&'+target+'&token='+token+'&search=' + escape($item.parent().find('textarea').val());
        }

        var iframe_str = '<iframe width="'+oWidth+'px" height="'+oHeight+'px" frameborder="0" id="docframe" />';
        var iframe = $(iframe_str).attr('src', src).appendTo('body');

        $('#docframe').css('width', '100%');
        $('#docframe').css('height', '100%');

        setTimeout(function() {
                iframe.dialog({
                        title: title,
                        width: oWidth,
                        height:oHeight,
                        closeOnEscape: true,
                        modal: true,
                        close: function() {
                            $(this).remove();
                        }

                    });
            }, 1);
        return false;
    }

    $('img.openlnet').live('click', function (ev) {
        var $item = $(this);
        var $target = $(ev.target);

        if ($target.is('.openlnet')) {
            var classes = $target.attr('class');
            classes = classes.split(' ');
            var lnet = null;
            for (var i = 0; i < classes.length; i++) {
                if (classes[i] !== 'openlnet') {
                    lnet = classes[i];
                    break;
                }
            }
            if (lnet !== null) {
                openlnet($item, lnet);
            }
        }

        return false;
    });

    $('a.openlnet').live('click', function(ev) {
        var $item = $(this);
        var $target = $(ev.target);

        if ($target.is('.openlnet')) {
            openlnet($item);
        }

        return false;
    });

    $('input.feedback').click(function(ev) {
        var $item = $(this);
        var $target = $(ev.target);

        if ($target.is('.feedback')) {
            openlnet($item, "Feedback");
        }

        return false;
    });


});

