
// 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('?', '');
	
        //~ var result = /_session=(.*?)(&|$)/.exec(search);
        
        return document.forms[0]._session.value; //result && result[1];
    };

    jQuery.isInView = function(el) {
        var top = el.offsetTop;
        var left = el.offsetLeft;
        var width = el.offsetWidth;
        var height = el.offsetHeight;

        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);
            });
	    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];
		var vars = null;
		
		if (parts[1]) 
			vars = parts[1].split('&');
	
		if (!base) base = loc;
			
		if (vars) { 
			base = base + '?'+vars[0];
		} else {
			base = base;
		}

		if (base.search("logicnets.lns") === -1) {
			base = base + "expert/logicnets.lns?";
		}
		
		if (base.search("_session") === -1) {
			base = base + "&_session=" + $("input[name=_session]").val();
		}

		return base;

	}
	
	function openlnet($item, name, alt, width, height, url, params)
	{
		//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("name") == '') {
				var src = get_session_url() + '&verb=openlnet&type=vfile&id=' + name + '&token='+token+'&'+params;
			} else {
				var src = get_session_url() + '&verb=openlnet&type=vfile&id=' + $item.attr("name") + '&token='+token+'&'+params;
			}
		}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());

		}

		if (width) 
			oWidth = width;
		if (height) 
			oHeight = height;
		if (alt)
			title = alt;
		if (url)
			src = url;

		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;
	    var width = null;
	    var height = null;
	    var url = null;
	    var params = null;
            for (var i = 0; i < classes.length; i++) {
                if (classes[i].search(/net_\S*/) !== -1) {
                    lnet = classes[i].substring(4);
                } else if (classes[i].search(/width_\S*/) !== -1) {
			width = parseFloat(classes[i].substring(6));
		} else if (classes[i].search(/height_\S*/) !== -1) {
			height = parseFloat(classes[i].substring(7));
		} else if (classes[i].search(/params_\S*/) !== -1) {
			params = classes[i].substring(7);
		}
            }
            if (lnet !== null) {
                openlnet($item, lnet, $(this).attr('alt'), width, height, null, params);
            }
        }

        return false; 
    });

	$('a.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 width = null;
		    var height = null;
		    var params = null;
		    for (var i = 0; i < classes.length; i++) {
			if (classes[i].search(/width_\S*/) !== -1) {
				width = parseFloat(classes[i].substring(6));
			} else if (classes[i].search(/height_\S*/) !== -1) {
				height = parseFloat(classes[i].substring(7));
			} else if (classes[i].search(/params_\S*/) !== -1) {
				params = parseFloat(classes[i].substring(7));
			}
		    }
		    openlnet($item, name, null, width, height, null, params);
		}

		return false;
	});

	$('a.openlnet_url').live('click', function(ev) {
		var $item = $(this);
		var $target = $(ev.target);

		if ($target.is('.openlnet_url')) {
		    var classes = $target.attr('class');
		    classes = classes.split(' ');
		    var width = null;
		    var height = null;
		    for (var i = 0; i < classes.length; i++) {
			if (classes[i].search(/width_\S*/) !== -1) {
				width = parseFloat(classes[i].substring(6));
			} else if (classes[i].search(/height_\S*/) !== -1) {
				height = parseFloat(classes[i].substring(7));
			}
		    }
		    openlnet($item, null, null, width, height, $item.attr('href'));
		}
		return false;
	});
	
	$('input.feedback').click(function(ev) {
		var $item = $(this);
		var $target = $(ev.target);

		if ($target.is('.feedback')) {
			openlnet($item, "Feedback");
		}

		return false;
	});



});

