﻿dojo.require("dojo.io.script");

GetTweets = function (lat, long, radius, page, onSuccess, onError) {

    dojo.io.script.get({
        url: "http://search.twitter.com/search.json?geocode=" + lat + "," + long + "," + radius + "mi&rpp=50&page=" + page,
        handleAs: "json",
        preventCache: true,
        callbackParamName: "callback",
        load: function (response, ioArgs) { eval(onSuccess(response, { lat: lat, long: long })); },
        error: function (response, ioArgs) { eval(onError({ ErrorCode: 0, ErrorMessage: response.message })); }
    });

};


function LoadTweets() {
    
    _tweetsLayer.clear();

    for (i = 1; i < 2; i++) {
        // Quito
        GetTweets(-0.19806944070711552, -78.48406794272222, 5, i, ProcessGetTweetsResponse, GettingTweetsError);

        // Cuenca
        GetTweets(-2.885231941592906, -78.99188141215859, 5, i, ProcessGetTweetsResponse, GettingTweetsError);

        // Guayaquil
        GetTweets(-2.11993377979843, -79.91925689104193, 5, i, ProcessGetTweetsResponse, GettingTweetsError);
    }

    if (_onTweetMouseClick == null)
        _onTweetMouseClick = dojo.connect(_tweetsLayer, "onClick", ShowTweetsPerUser);
    else {
        dojo.disconnect(_onTweetMouseClick);
        _onTweetMouseClick = dojo.connect(_tweetsLayer, "onClick", ShowTweetsPerUser);    }


    ShowLoading();

}

function GoToGYETweets() {
    _gaq.push(['_trackEvent', 'Eventos Recurrentes', 'Geo Tweets', 'Guayaquil']);
    _tweetsLayer.show();    
    var p = new esri.geometry.Point(-79.91925689104193, -2.11993377979843, _map.spatialReference);
    _map.centerAndZoom(GetConvertedPoint(p), GetConvertedLevel(8));
}


function GoToUIOTweets() {
    _gaq.push(['_trackEvent', 'Eventos Recurrentes', 'Geo Tweets', 'Quito']);
    _tweetsLayer.show();
    var p = new esri.geometry.Point(-78.48406794272222, -0.19806944070711552, _map.spatialReference);
    _map.centerAndZoom(GetConvertedPoint(p), GetConvertedLevel(8));
}

function GoToCUETweets() {
    _gaq.push(['_trackEvent', 'Eventos Recurrentes', 'Geo Tweets', 'Cuenca']);
    _tweetsLayer.show();  
    var p = new esri.geometry.Point(-78.99188141215859, -2.885231941592906, _map.spatialReference);
    _map.centerAndZoom(GetConvertedPoint(p), GetConvertedLevel(8));
}

var _onTweetMouseClick = null;
function GoTweets() {
    
    if (!$("#tweetsLocations").is(":visible")) {
        dojo.removeClass("btnTweets", "btnTweets");
        dojo.addClass("btnTweets", "btnTweets_over");
/*        
        if (_onTweetMouseClick == null)
            _onTweetMouseClick = dojo.connect(_tweetsLayer, "onClick", ShowTweetsPerUser);
        else {
            dojo.disconnect(_onTweetMouseClick);
            _onTweetMouseClick = dojo.connect(_tweetsLayer, "onClick", ShowTweetsPerUser);
        }*/

        $("#tweetsLocations").show();

    }
    else {
        dojo.removeClass("btnTweets", "btnTweets_over");
        dojo.addClass("btnTweets", "btnTweets");

        _tweetsLayer.hide();        
        
        dojo.disconnect(_onTweetMouseClick);
        dojo.byId("userTweets").style.display = "none";
        clearInterval(_checkUserTweetsTimer)

        $("#tweetsLocations").hide();
    }
    
}

function HasCoords(c) {

    var coords = c.split(',');

    if (coords.length == 2) {
        if (!isNaN(coords[0]) && !isNaN(coords[1]))
            return true;
        else
            return false;
    }
    else
        return false;

}

function GetCoords(c) {
    var coords = c.split(',');
    var fcoords = new Array(2);
    fcoords[0] = parseFloat(coords[0]);
    fcoords[1] = parseFloat(coords[1]);
    return fcoords;
}

function GettingTweetsError(error) {
    //alert(error.Message);
}

function nextGaussian() {
    var v1, v2, s;
    do {
        v1 = 2 * Math.random() - 1;   // between -1.0 and 1.0
        v2 = 2 * Math.random() - 1;   // between -1.0 and 1.0
        s = v1 * v1 + v2 * v2;
    } while (s >= 1 || s == 0);
    var multiplier = Math.sqrt(-2 * Math.log(s) / s);
    nextNextGaussian = v2 * multiplier;
    return v1 * multiplier;
}

function ProcessGetTweetsResponse(result, center) {
    
    var results = result.results;

    var pColl = new esri.geometry.Multipoint(_map.spatialReference);

    var p = 0;
    for (var k = 0; k < results.length; k++) {
        var hasPoint = false;
        for (var f = 0; f < _tweetsLayer.graphics.length; f++) {
            if (_tweetsLayer.graphics[f].attributes.pID == results[k].from_user_id) {
                hasPoint = true;
                //_tweetsLayer.graphics[f].infoTemplate.content += "<br /><br /><span style=\"font-size:9px; color:#333;\">" + new Date(results[k].created_at).localeFormat('yyyy-MM-dd hh:mm') + "</span><br /><span style=\"font-size:11px;\">" + results[k].text + "</span>";
                break;
            }
        }

        /*if (results[k].geo != null)
            alert(0);*/

        var lat, long;
        var b = true;
        if (results[k].location == null) results[k].location = "";
        if (!HasCoords(results[k].location)) {
            b = false;
            var s = -1;

            var t = Math.random() * 5;
            if (t > 2.5)
                s = 1;
            lat = center.lat + (nextGaussian() * 0.07 * s);
            long = center.long + (nextGaussian() * 0.07 * s);

        }
        else {
            lat = GetCoords(results[k].location)[0];
            long = GetCoords(results[k].location)[1];
        }

        if (!hasPoint) {
            pColl.addPoint(new esri.geometry.Point(lat, long, _map.spatialReference));
            g = "";
            if (b)
                g = "*";

            var myAttributes = { pID: results[k].from_user_id, pLong: long, pLat: lat, pUser: results[k].from_user };

            var textSymbol = new esri.symbol.TextSymbol("@" + results[k].from_user).setColor(
                _currentMapType=="BING"?new dojo.Color([250, 250, 250]): new dojo.Color([0, 52, 78])).setFont(
                new esri.symbol.Font("15px").setWeight(esri.symbol.Font.WEIGHT_BOLD).setFamily("Verdana"));

            var point = new esri.geometry.Point(pColl.points[p][1], pColl.points[p][0], _map.spatialReference);
            
            point = GetConvertedPoint(point);
            
            _tweetsLayer.add(new esri.Graphic(point,
                textSymbol).setAttributes(myAttributes));

            /*var sfs = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID,
            new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT,
            new dojo.Color([255, 0, 0]), 2), new dojo.Color([255, 255, 0, 0.25]));*/

            //_tweetsLayer.add(new esri.Graphic(point, sfs).setAttributes(myAttributes));

            p++;
        }
    }

}

function parseTwitterDate($stamp) {
    // convert to local string and remove seconds and year //		
    //var date = new Date(Date.parse($stamp)).toLocaleString().substr(0, 16);
    var date = new Date(Date.parse($stamp));
    return date.format("yyyy.MM.dd hh:mm tt");
    
}

GetTweetsPerUser = function (user, n, onSuccess, onError) {

    dojo.io.script.get({
        url: "http://search.twitter.com/search.json?q=from%3A" + user + "&rpp=" + n + "&page=1&result_type=recent",
        handleAs: "json",
        preventCache: true,
        callbackParamName: "callback",
        load: function (response, ioArgs) { eval(onSuccess(response, { name: user })); },
        error: function (response, ioArgs) { eval(onError({ ErrorCode: 0, ErrorMessage: response.message })); }
    });

};

var tUserName = "";

function ShowTweetsPerUser(event) {

    dojo.byId("userTweets").style.display = "block";
    _currentUserLastTweet = ""
    clearInterval(_checkUserTweetsTimer)

    tUserName = event.graphic.attributes.pUser;
    GetTweetsPerUser(tUserName, 5, p1, e1);
}

var _checkUserTweetsTimer = null;
var _currentUserLastTweet = ""; 

function p1(result, user) {

    dojo.byId("userTweetsContent").innerHTML = "";
    dojo.byId("userTweetName").innerHTML = "<a style=\"text-decoration:none; color:#fff;\" href=\"http://twitter.com/" + user.name + "\" target=\"blank\">@" + user.name + "</a>";

    for (i = 0; i < result.results.length; i++) {
        dojo.byId("userTweetsContent").innerHTML += "<div class=\"userTweetBox\" name=\"utw\">" + result.results[i].text + "<br /><br /><span style=\"font-size:8px;\">" + parseTwitterDate(result.results[i].created_at) + "</span></div>";
    }

    _currentUserLastTweet = result.results[0].text;

    _checkUserTweetsTimer = setInterval("GetTweetsPerUserX()", 50000);
}

function e1(error) {
    alert(error.Message);
}

function GetTweetsPerUserX() {
    GetTweetsPerUser(tUserName, 1, p2, e2);
}

function p2(result, user) {
    if (result.results.length > 0) {
        //alert($("#userTweetsContent div[name*=utw]")[0].innerHTML);
        if (result.results[0].text != _currentUserLastTweet) {
            if ($("#userTweetsContent div[name*=utw]").length >= 5)
                $("#userTweetsContent div[name*=utw]")[4].style.display = "none";

            newInnerHTML = "<div class=\"userTweetBox\" name=\"utw\">" + result.results[0].text + "<br /><br />" + parseTwitterDate(result.results[0].created_at) + "</div>" + dojo.byId("userTweetsContent").innerHTML;

            dojo.byId("userTweetsContent").innerHTML = newInnerHTML;

            _currentUserLastTweet = result.results[0].text;
        }
    }
}

function e2(error) {
    clearInterval(_checkUserTweetsTimer)
    alert(error.Message);
}

function HideUserTweets() {
    clearInterval(_checkUserTweetsTimer)
    dojo.byId("userTweets").style.display = "none";
}
