/*jslint browser: true */
/*globals Jaxer, jQuery, Processing,
    getTopicLinks, getPostInfo, layout_fruchterman_reingold_2d */
   
jQuery(document).ready(function () {
    var aptanaForumUrl = "http://forums.aptana.com/viewforum.php?f=37",   
        nodes = [], edges = [], 
        nodes2 = [], edges2 = [], 
        authors = {}, terms = {},
        cache = {};

    function createCloud(input, output, words) {
        var i;
        
        for (i = 0; i < words.length; i += 1) {
            jQuery(input).append(words[i].toUpperCase() + " ");
        }        
        jQuery(input).dynaCloud(output);        
    }

    function addCloudClick(cloud, g1, g2) {
        jQuery(cloud + " a").bind("click", function (e) {
            var text = jQuery("span", this).text();
            
            jQuery(cloud).removeHighlight().highlight(text);
            
            function selectCircle(g, nds) {
                var i; 
                
                g.redraw();
                g.fill(0, 0, 255);
                for (i = 0; i < nds.length; i += 1) {
                    if (nds[i].reference.toLowerCase().indexOf(text
                            .toLowerCase()) !== -1) {
                        g.ellipse(nds[i].x, nds[i].y, 
                            nds[i].r, nds[i].r);
                    }
                }
                g.noFill();
            }
            
            selectCircle(g1, nodes);
            selectCircle(g2, nodes2);
        });
    }
        
    function createGraph(layout, p, p2, nds, nds2, dgs, title) {
        var i, j, el, tooltip, dragging = false, 
            w, h, bx = 0, by = 0, bdifx = 0, bdify = 0, z = 1;        

        el = jQuery(layout).get(0);
        w = el.clientWidth;
        h = el.clientHeight;
        
        tooltip = jQuery("#tooltip").get()[0];
                       
        for (i = 0; i < nds.length; i += 1) {
            nds[i].x += w / 2; 
            nds[i].y += h / 2; 
        }
               
        p.setup = function () {            
            p.size(w, h);     
            p.stroke(0);   
            p.strokeWeight(0.5);
            p.frameRate(15);   
            p.noLoop();                                   
        };
        
        p.draw = function () {   
            p.background(255);
            
            for (i = 0; i < nds.length; i += 1) {
                p.ellipse(nds[i].x, nds[i].y, nds[i].r, nds[i].r);                    
            }

            for (i = 0; i < dgs.length; i += 1) {
                p.line(nds[dgs[i].from].x, nds[dgs[i].from].y, 
                    nds[dgs[i].to].x, nds[dgs[i].to].y); 
            }            
        };
        
        p.mouseMoved = function (text) {            
            for (i = 0; i < nds.length; i += 1) {
                if (p.dist(nds[i].x, nds[i].y, 
                    p.mouseX, p.mouseY) < nds[i].r / 2) {                        
                    tooltip.style.left = p.mouseX + 
                        el.offsetLeft + 'px';
                    tooltip.style.top = p.mouseY + 
                        el.offsetHeight + 'px';
                    tooltip.innerHTML = nds[i].reference;
                    tooltip.style.visibility = 'visible';
                    jQuery(layout).css("cursor", "pointer");                                                    
                    break;
                } else {
                    tooltip.style.visibility = 'hidden';                    
                    jQuery(layout).css("cursor", "move");                                                    
                }                    
            }            
        };
        
        p.mousePressed = function () {
            bdifx = p.mouseX - bx;   
            bdify = p.mouseY - by;       
        };

        p.mouseDragged = function () {
            bx = p.mouseX - bdifx;
            by = p.mouseY - bdify;
            bdifx = p.mouseX;
            bdify = p.mouseY;
            for (i = 0; i < nds.length; i += 1) {
                nds[i].x += bx;
                nds[i].y += by;
            }
        };

        p.mouseReleased = function () {                               
            bx = 0;                               
            by = 0;
            bdifx = 0;
            bdify = 0;
            
            p.redraw();
        };
                
        jQuery(layout).mousewheel(function (event, delta) {            
            if (delta < 0) {
                z *= 0.9;
            } else {
                z *= 1.1;
            }           

            for (i = 0; i < nds.length; i += 1) {
                nds[i].x *= z;
                nds[i].y *= z;
                nds[i].r *= z;
            }
            z = 1;
            
            p.redraw(); 

            return false;
        });

        jQuery(layout).bind("click", function (e) {
            jQuery("#cloud1").removeHighlight();
            jQuery("#cloud2").removeHighlight();
                        
            p.redraw();
            p2.redraw();
            
            for (i = 0; i < nds.length; i += 1) {
                if (p.dist(nds[i].x, nds[i].y, 
                    p.mouseX, p.mouseY) < nds[i].r / 2) {                
                    p.fill(0, 0, 255);
                    p.ellipse(nds[i].x, nds[i].y, nds[i].r, nds[i].r);                    
                    p.noFill();

                    jQuery("#cloud1").highlight(tooltip.innerHTML);                        
                    jQuery("#cloud2").highlight(tooltip.innerHTML);                        
                     
                    for (j = 0; j < nds2.length; j += 1) {
                        if (nds2[j].reference === tooltip.innerHTML) {
                            p2.fill(0, 0, 255);
                            p2.ellipse(nds2[j].x, nds2[j].y, 
                                nds2[j].r, nds2[j].r);                    
                            p2.noFill();
                            break;
                        }                    
                    }        
                        
                    break;
                }                    
            }                    
        });

        jQuery(layout).bind("dblclick", function (e) {            
            for (i = 0; i < nds.length; i += 1) {
                if (p.dist(nds[i].x, nds[i].y, 
                    p.mouseX, p.mouseY) < nds[i].r / 2) {                
                    window.open(nds[i].link);    
                    break; 
                }                    
            }                                    
        });
                        
        p.init();                                                        
    }
        
    function addNodes(link, arr, nodes, ass) {
        var i, el, node;
        
        for (i = 0; i < arr.length; i += 1) {
            el = arr[i];                    
            if (ass[el] === undefined) {
                node = {};
                node.x = Math.random() * 2 - 1;
                node.y = Math.random() * 2 - 1;
                node.r = 10;
                node.reference = el;
                node.i = nodes.length;
                node.link = link;
                nodes.push(node);
                ass[el] = 1;
            } else {
                ass[el] += 1;
            }
        }
    }
    
    function lookupNode(text, nodes) {
        var i;

        for (i = 0; i < nodes.length; i += 1) {
            if (text === nodes[i].reference) {
                break;
            }
        }
       
        return nodes[i];      
    }
    
    function isNewEdge(edge, edges) {
        var i, status = true;

        for (i = 0; i < edges.length; i += 1) {
            if (edge.from === edges[i].from && 
                edge.to === edges[i].to) {
                status = false;
                break;
            }
        }
       
        return status;      
    }    

    function addEdges(arr, nodes, edges) {
        var i, node, edge;

        for (i = 1; i < arr.length; i += 1) {
            if (arr[0] !== arr[i]) {
                edge = {};
                node = lookupNode(arr[0], nodes);
                edge.from = node.i;
                node = lookupNode(arr[i], nodes);
                edge.to = node.i;
                if (isNewEdge(edge, edges)) {
                    edges.push(edge);
                }                        
            }
        }                        
    }

    function forumScraping(forumUrl, keyRefDate) {
        var i, n, topics = [], post, author, 
            counter, inc, graph1, graph2;

        graph1 = Processing(jQuery("#graph1").get(0));
        graph1.background(255);     
        graph2 = Processing(jQuery("#graph2").get(0));                
        graph2.background(255);     
                                                                    
        topics = getTopicLinks(forumUrl);
        n = topics.length;
        inc =  jQuery("#forum").width() / n;

        counter = jQuery("#forum_counter");
        for (i = 0; i < n; i += 1) {

            if (cache.hasOwnProperty(topics[i])) {
                post = cache[topics[i]];
            } else {
                post = getPostInfo(topics[i]);
                cache[topics[i]] = post;              
            }                      
                           
            addNodes(topics[i], post.authors, nodes, authors);
            addEdges(post.authors, nodes, edges);
            addNodes(topics[i], post.tags, nodes2, terms);                       
            addEdges(post.tags, nodes2, edges2);

            createCloud("#text1", "#cloud1", post.authors);   
            author = post.tags.shift();                         
            createCloud("#text2", "#cloud2", post.tags);
            post.tags.unshift(author);
                        
            counter.css("width", (inc * (i + 1)) + 'px');
        }
        addCloudClick("#cloud1", graph1, graph2);
        addCloudClick("#cloud2", graph1, graph2);
                
        nodes = layout_fruchterman_reingold_2d(nodes, edges, {
            area: nodes.length * nodes.length * (nodes.length / 4),
            repulserad: nodes.length * nodes.length * nodes.length *
            (nodes.length / 4)
        });        
        nodes2 = layout_fruchterman_reingold_2d(nodes2, edges2, {
            area: nodes.length * nodes.length * (nodes.length / 4),
            repulserad: nodes.length * nodes.length * nodes.length *
            (nodes.length / 4)
        });
        createGraph("#graph1", graph1, graph2, nodes, nodes2, edges, 
            "Author - CoAuthor Graph");
        createGraph("#graph2", graph2, graph1, nodes2, nodes, edges2, 
            "Author - Tags Graph");        
    }
            
    jQuery("#go").bind("click", function (e) {
        var forumUrl = jQuery("#forum").val(),
            now = new Date(), 
            ddNow = now.getDate(),
            mmNow = now.getMonth(),
            yyNow = now.getFullYear(),
            keyRefDate = yyNow + "/" + (mmNow + 1) + "/" + ddNow; 

        nodes = [];
        edges = []; 
        nodes2 = []; 
        edges2 = []; 
        authors = {}; 
        terms = {};  

        jQuery("#cloud1").empty();
        jQuery("#cloud2").empty();        
                
        jQuery("#go").attr("disabled", true);
        jQuery("#content").css("cursor", "progress");        
        jQuery("#forum_counter")
            .css("visibility", "visible").css("width", "0px");
                 
        try {            
            forumScraping(forumUrl, keyRefDate);
        } catch (ex) {
        }
        jQuery("#content").css("cursor", "default");        
        jQuery("#go").attr("disabled", false);
        jQuery("#forum_counter").css("visibility", "hidden");
        
        jQuery("#text1").empty();
        jQuery("#text2").empty();
    });
    
    jQuery("#help").bind("click", function (e) {
        window.open("docs/CReMA_help.html");            
    });
    
    jQuery("#forum").val(aptanaForumUrl);      
    jQuery("#go").attr("disabled", false);    
                
    jQuery.dynaCloud.auto = false;
    jQuery.dynaCloud.wordStats = false;
    jQuery.dynaCloud.max = 69;
    jQuery.dynaCloud.scale = 4;
    jQuery.dynaCloud.stopwords = [];
                
});


