/* Author : Jose & Sandeep */

(function (undefined) {

    var eles = {
        container : $("#container")
    }

    var sBASE = function () {
        var self,
            config = {};


        var UI = {
            cleanUp: function () {
                $("html").removeClass("no-js");
                $('#js-spotify-dropdown').dropdown();
                return this;
            },
            smartRadioBtns: function (parent) {
                parent.find(":radio").change(function () {
                    parent.find("label").removeClass("press").filter("label[for='" + $(this).attr("id") + "']").addClass("press");
                }).each(function () {
                    var me = $(this);
                    me.is(":checked") && me.trigger('change');
                });
                return this;
            },
            smartCheckBox: function (parent) {
                parent.find(":checkbox").change(function () {
                    parent.find("label[for='" + $(this).attr("id") + "']").toggleClass("press");
                }).each(function () {
                    var me = $(this);
                    me.is(":checked") && me.trigger('change');
                });
                return this;
            }
        };

        var EXT = {};

        EXT.spotify = function (apiUrl, userId, onSongChange, onError) {
            var config = {
                fetchInterval : 60000 /*ms*/
            };

            // Raw data structure

            var user = {
                    id: userId,
                    name: '',
                },
                track = {
                    song: '',
                    artist: '',
                    url: ''
                };

            var timer = false;

            // Sanitary check
            if ($.type(apiUrl) !== 'string' || apiUrl === '' || $.type(onSongChange) !== 'function') {
                return false;
            }


            function fetchSong() {
                clearTimeout(timer);
                $.ajax({
                    type: 'POST',
                    url: apiUrl,
                    data: {'uid': user.id},
                    dataType: 'json',
                    success: function (data){
                        // check for error condition
                        if(data.error !== undefined && jQuery.type(data.error) === "string") {
                            onError(data.error);
                            loopFetchSong();
                            return;
                        }
                        // Song not changed
                        if(data.song === track.song){
                            return;
                        }
                        track = {
                            song: data.song || '',
                            artist: data.artist || '',
                            url: data.url || ''
                        };
                        user = {
                            id: data.userId || user.id,
                            name: data.displayName || user.name
                        };
                        onSongChange(track, user);
                        loopFetchSong();
                    },
                    error: function (jqXHR, textStatus, errorThrown){
                        onError(errorThrown);
                    }
                });
            }

            function loopFetchSong(){
                timer = setTimeout(function () {
                    fetchSong();
                }, config.fetchInterval);
            }

            fetchSong();

            return {
                setUser: function (id, name) {
                    if (user.id !== id) {
                        user.id = id;
                        user.name = name;
                        //Call fetch song on change of user id;
                        fetchSong();
                    }
                }
            };

        };

        EXT.googleMaps = function () {
                var sMap = {},
                    lat, lng, contentStr;

                sMap.mapConf = {
                    ele: $("#googlemaps"),
                };

                if (typeof google === "undefined" || sMap.mapConf.ele.length === 0) {
                    return false;
                }
                lat = sMap.mapConf.ele.data('lat');
                lng = sMap.mapConf.ele.data('lng');
                contentStr = sMap.mapConf.ele.data('content');

                // Google Map options
                var mapOptions = {
                    zoom: 14,
                    center: new google.maps.LatLng(lat, lng),
                    mapTypeId: google.maps.MapTypeId.ROADMAP,
                    streetViewControl: false
                };

                sMap.map = new google.maps.Map(sMap.mapConf.ele[0], mapOptions);
                sMap.marker = new google.maps.Marker({
                    map: sMap.map,
                    animation: google.maps.Animation.DROP,
                    icon: sMap.mapConf.markerIcon
                });

                sMap.infoWindow = new google.maps.InfoWindow({
                    content: contentStr
                });

                sMap.setMarker = function (lat, lng) {
                    var latLng = new google.maps.LatLng(lat, lng);
                    this.map.setCenter(latLng);
                    this.marker.setPosition(latLng);
                    return this.marker;
                };

                sMap.setMarker(lat, lng);
                google.maps.event.addListener(sMap.marker, 'click', function() {
                  sMap.infoWindow.open(sMap, sMap.marker);
                });

                return sMap;
        };

        var SWAY = {};

        /* Header spotify display function */
        SWAY.spotify = function () {
            var config = {
                    fetchInterval : 60000, /*ms*/
                    apiUrl: '/utilities/wsit/'
                },
                ele = {
                    songInfo: $('#current-song'),
                    curUser: $('#spotify-live-user')
                },
                cookie = $.cookie('_sway_spotify'),
                userId = cookie !== null ? cookie : ele.curUser.data('uid');

            ele.more = ele.songInfo.find('.more');

            var spotifyLib = EXT.spotify(config.apiUrl, userId, function (track, user) {
                if (user.name != '') {
                    ele.curUser.text(user.name);
                }

                if (track.url !== '' && track.artist !== '') {
                    ele.more.html('<span class="artist">' + track.artist+' </span>' + '<a class="song" href="' + track.url+'" target="_blank">' +track.song + '</a>');
                } else {
                    ele.more.html('<span class="song">' + track.song +'</span>');
                }
                ele.songInfo.fadeIn();

            }, function (errorThrown){
                ele.songInfo.html('<span class="error">'+errorThrown+'</span>');
            });


            $('#js-spotify-dropdown .dropdown-menu').delegate('li', 'click' , function () {
                var me = $(this).children('a'),
                    displayName = me.text(),
                    userId = me.data('uid');

                if (!userId) {
                    return;
                }
                ele.curUser.text(displayName);
                ele.songInfo.fadeOut('slow');
                // Set new user id
                spotifyLib.setUser(userId, displayName);
                // To hide drop down
                $('html').click();

                $.cookie('_sway_spotify', userId, { expires: 1, path: '/' });
                return false;
            });

        };

        return {
            'UI': UI,
            'EXT': EXT,
            'SWAY': SWAY
        };
    }();

    sBASE.UI.cleanUp()



    $(document).ready(function(){
        sBASE.SWAY.spotify();
        sBASE.EXT.googleMaps();
    });

})();

