/**
 * campaign - handle campaign related functionality 
 * 
 * @author: Chanel Munezero <chanel.munezero@escapemg.com>
 */
(function(){
    if(!window.gs) {
        return;
    }
    
    var campaign = window.gs.campaign = {
        // default options/settings
        
        empty: null
    };
    
    campaign.init = function() {
        // initialize form handler
        campaign.handleForm();
    };

    campaign.handleForm = function() {
        // include all songs toggle
        $('#chooseAllSongsToggle').change(function(){
            var container = $(this).parent().siblings('dl');
            var input = $(container).find('input.search');
            var button = $(input).siblings('button');
            //debug(container, input, button);
            if(this.checked) {
                debug('is checked');
                // disable search input and button, make their container opacity=.5
                $(container).css('opacity','.5');
                $(input).attr('disabled','disabled');
                $(button).attr('disabled','disabled');
            } else {
                debug('not checked');
                // enable search input and button, make their container opacity=1
                $(container).css('opacity','1');
                $(input).removeAttr('disabled');
                $(button).removeAttr('disabled');
            }
        });
    };

    campaign.addNewSelected = function(obj) {
        debug('new sel', obj);
        var li = $(obj).siblings('.hide').children('ul').children('li').get(0);
        var type = ($(obj).parent().is('.song')) ? 'song' : 'artist';
        debug('li id:', li, li.id, 'addNewSelected type: '+type);
        if($('#selected-'+li.id).length) {
            debug('curr obj already exists', li);
            return false;
        }
        $(obj).parent().addClass('added');
        $('span',obj).text('Added');
        var newObj = li.cloneNode(true);
        // why are you auto checking the checkbox? .attr('checked','checked');
        $(newObj).find('input').not('.checkbox').attr('name', li.className+'s[]');
        newObj.id = 'selected-'+li.id;
        $(newObj).children('input').addClass('active');
        var container = $(obj).parent().parent().parent().parent().parent().parent();
        debug('curr container', container);
        if(!container.siblings('.selected').length) {
            container = container.parent();
        }
        debug('vinal container', container);
        var selected = container.siblings('.selected').children('ul');
        debug('final selected', selected);
        selected.append(newObj);
        $('#chooseAllSongsToggle').removeAttr('checked');
        debug('new obj', newObj, newObj.id, selected);
        // add similar
        var artistId = li.id.split('-')[1];
        var count = selected.children().length;
        if(li.id.split('-')[0]=='artist') {
            $('#artistCount').text(count);
            $('.sim',newObj).width($('.simPop',newObj).width()*.75);
            campaign.simArtistAdd(artistId, obj);
        } else {
            // increase song count
            $('#songCount').text(count);
        }
        return false;
    };
        
    campaign.removeNewSelected = function(obj) {
        var siblings = $(obj).parent().siblings();
        var type = ($(obj).parent().is('.song')) ? 'song' : 'artist';
        debug('remove new sel', obj, type);
        var removed = $(obj).parent().remove();
        var id = $(removed).attr('id');
        id = id.split('-');
        id = (id && id[2]) ? id[2] : id;
        var type = ($(removed).is('.song')) ? 'songs' : 'artists';
        $('ul.results.'+type+' #sr-'+id).removeClass('added').find('a.add span').text('Add');
        debug('remove added stuff: ul.'+type+' sr-'+id, $('ul.'+type+' sr-'+id));
        if(!siblings.length) {
            $('#chooseAllSongsToggle').attr('checked', 'checked');
        }
        //var count = parseInt($('#songCount').text());
        var count = siblings.length;
        count = (count==0 && $('#totalSongCount').length) ? $('#totalSongCount').text() : count;
        type = type.substring(0,type.length-1);
        $('#'+type+'Count').text(count+'');
        debug('jquery sel: #'+type+'Count', $('#'+type+'Count').get(0));
        return false;
    };

    campaign.toggleChoice = function(obj) {
        debug('campaign.togglechoice', obj, $(obj).siblings('input'));
        $(obj).siblings('input').click();
        $('.campaignChoices ul.options a').removeClass('selected');
        $(obj).addClass('selected');
        debug('add selected');
        // add call to change info box
        var type = $(obj).find('.type').text();
        $('#whatYouGet span').hide().filter('.'+type).show(); 
        $('#targetLocationPrice span').hide().filter('.'+type).show(); 
        debug('what you get and targetlocationprice');
        // make sure flyer choices are resolved
        $('#flyerTypePaid').attr('checked','checked');
        $('#flyerTypeFree').removeAttr('checked');
        return false;
    };
    campaign.toggleChoiceGroup = function(obj) {
        if(!obj || !obj.id) { debug('bad toggle choice group obj', obj);return; }
        var form = $(obj).parents('form').get(0);
        debug('form flyer type: ', form, form.flyerType, form.elements['flyerType']);
        if(obj.id=='flyerTypeFree') {
            debug('free flyer');
            $(obj).siblings('input').attr('checked','checked');
            $('ul.options a').removeClass('selected');
        } else {
            debug('paid flyer');
            var sel = $('ul.options a').removeClass('selected').get(2);
            $(sel).addClass('selected');
        }
    }

    campaign.tabClick = function(obj, id) {
        $(obj).parent().siblings().children('.active').removeClass('active');
        $(obj).addClass('active');
        /*
        $('#campaignPanes .active').fadeOut("slow", function(){
            $(this).removeClass('active');
            $(id).fadeIn("slow").addClass('active');
        });
        */
        $('#campaignPanes').children('.active').hide().removeClass('active');
        $(id).show().addClass('active');
        
        return false;
    }

    campaign.simArtistRemove = function(artistID, obj, useClass)
    {
        useClass = useClass || false;
        debug('sim artist remove: '+artistID, obj);
        if(useClass) {
            $(obj).parent().parent().parent().removeClass('active');
        } else {
            $(obj).parent().parent().parent().fadeOut();
        }
        // send ajax call
        var params = {command:'remove', id:artistID}
        
        $.getJSON('/promotion/editSimilarArtists.json', params, function(json) {
            // if in the add similar page, don't change the count b/c it's a global, not per account total 
            if(location.href.match('account/addSimilar')) {
                return false;
            }
            debug('edit sim artist return', json);
            var num = parseInt($('#browseTotalResults').html());
            $('#browseTotalResults').html(num-1);
        });
        return false;
    }

    campaign.simArtistAdd = function(artistID, obj)
    {
        debug('sim artist add: '+artistID, obj);
        //$(obj).parent().parent().parent().fadeOut();
        $(obj).parent().parent().addClass('active');
        // send ajax call
        var similarity = parseInt($(obj).siblings('.active').children('.similarity').val() || 30);
        if(!similarity || similarity < 30) { similarity = 30; }
        var slider = $(obj).siblings('.active').children('.slider');
        var width = slider.width();
        var newLeft = parseInt(similarity * (width / 100));
        $('.handle',slider).css('left',newLeft+'px');
        var params = {command:'update', id:artistID, value:similarity}
        $.getJSON('/promotion/editSimilarArtists.json', params, function(json) {
            debug('edit sim artist return', json);
        });
        return false;
    }
    campaign.simArtistToggle = function(artistID, obj) {
        var container = $(obj).parent().parent().parent().get(0);
        debug(container);
        if($(container).hasClass('active')) {
            campaign.simArtistRemove(artistID, $('.details a.remove',container), true);
        } else {
            campaign.simArtistAdd(artistID, $('.details a.add',container));
        }
        return false;
    }

    campaign.simArtistUpdate = function(artistID, weight, callback)
    {
        debug('sim artist update: '+artistID+'weight: '+weight);
        var params = {command: 'update', id: artistID, value: weight}
        $.getJSON('/promotion/editSimilarArtists.json', params, function(json) {
            debug('edit sim artist return', json);
            $('#sim-'+artistID).text(json.similarity).hide().show();
            // update the green bar, and similarity text
        });
    }

    campaign.simArtistSlidersInit = function(obj) {
        obj = obj || 'div.slider';
        var sliderId = 'handle'+(new Date()).getTime()+'-';
        $(obj).slider('destroy'); 
        $(obj).each(function(i) {
            var startValue = $(this).siblings('input.similarity').val();
            var artistID = $(this).siblings('input.artistID').val();
            var self = this;
            var ajaxTimeout;
            $('.ui-slider-handle', self).each(function(i) {
                //debug('curr: '+i, this); 
                this.id = sliderId+i;
            })
            var sliderhandles = '#'+sliderId+'0,#'+sliderId+'1';
            //debug('sliders: '+sliderhandles+', st: '+startValue, $(sliderhandles));
            setTimeout(function() {
                $(self).slider({
                    stop: function(event, ui) {
                        debug('slider stop',event, ui);
                        clearTimeout(ajaxTimeout);
                        gs.campaign.simArtistUpdate(artistID, ui.value);
                    }
                });
                // for some reason slider isn't giving me stop or other callbacks so create our own
                $('.handle', self).mouseup(function(){
                    $('.bar',self).css('width',$(self).slider('value')+'%');
                    clearTimeout(ajaxTimeout);
                    ajaxTimeout = setTimeout(function(){
                        var newVal = $(self).slider('value');
                        debug('new value:'+newVal, self, $('.bar',self).get(0));
                        gs.campaign.simArtistUpdate(artistID, $(self).slider('value'));
                    },500);
                }).mousemove(function(){
                    $('.bar',self).css('width',$(self).slider('value')+'%');
                    clearTimeout(ajaxTimeout);
                    ajaxTimeout = setTimeout(function(){
                        var newVal = $(self).slider('value');
                        debug('new value:'+newVal, self, $('.bar',self).get(0));
                        gs.campaign.simArtistUpdate(artistID, $(self).slider('value'));
                    },500);
                });
                // init slider value
                //$(self).slider('value',startValue);
                var width = $(self).width();
                var newLeft = parseInt(startValue * (width / 100));
                $('.handle',self).css('left',newLeft+'px');
            }, 500);
        });
    };

    campaign.initSongBreakdown = function(url, obj) {
        debug('WHY ARE YOU CALLING ME');
    }

    campaign.campaignSummary = function(obj)
    {
        obj = obj || '#campaignSummaryWrapper';
        var cb = $(obj);
        if(!cb.length) {
            debug('incorrect campaign breakdown obj, try again');
            return false;
        }
        $.getJSON('/promotion/campaigns.json', function(json) {
            debug('got back from getting campaign summary');
            $(cb).html(json.html);
            campaign.songBreakdown(cb);
        });
    }

    campaign.songBreakdown = function(obj) {
        debug('songbreakdown container',obj);
        var sb;
        this.lastUrl = '';
        this.lastQuery = '';
        if(typeof obj == 'string') {
            sb = $(obj);
            sb = sb.length ? sb : $('#'+obj);
        } else {
            sb = $(obj);
        }
        if(!sb.length) {
            debug('incorrect songbreakdown obj, try again');
            return false;
        }
        debug('FINAL songbreakdown container',sb);
        // capture form submit, and link click
        // todo: add query param
        $('form.songBreakdown',sb).submit(function() {
            // do update
            debug('songbreakdown form submit, action:'+this.action, this, sb);
            var args = '';
            var vals = '';
            var query = '';
            $('input,select',this).each(function() {
                //args.push({key:this.name, value:this.value});
                debug('name: '+this.name+', val: '+this.value);
                if(this.name=='query') {
                    query = this.value;
                }
                vals += this.value;
                args += encodeURI('&'+this.name+'='+this.value);
            });
            var url = this.action + args;
            //debug('url last', url, campaign.songBreakdown.lastUrl);
            if(url==campaign.songBreakdown.lastUrl) {
                debug('urls same');
                return false;
            }
            if(query && campaign.songBreakdown.lastQuery==query) {
                debug('last query same');
                return false;
            }
            if(!vals && campaign.songBreakdown.lastQuery==query) {
                debug('vals false and lastquery');
                return false;
            }
            campaign.songBreakdown.lastUrl = url;
            campaign.songBreakdown.lastQuery = query;
            debug('final args', args, this.action, url);
            campaign.songBreakdownUpdateByUrl(sb,url, obj);
            return false;
        });
        $('.pill a, .navigation li a, .pager li a',sb).click(function() {
            if(this.parentNode.className.match('exclude')) {
                return;
            }
            // do update
            var url = $(this).attr('value');
            url = url || this.href;
            debug('songbreakdown a click, url:'+url, this, sb);
            url = (url.substring(0,1)=='#') ? url.substring(1) : url;
            debug(url, campaign.songBreakdown.lastUrl);
            if(url==campaign.songBreakdown.lastUrl) {
                return false;
            }
            campaign.songBreakdown.lastUrl = url;
            campaign.songBreakdownUpdateByUrl(sb,url, obj);
            return false;
        });
    };
    campaign.songBreakdownUpdateByUrl = function(sb, url, obj) {
        sb = sb || '';
        url = url || '';
        if(!url || !sb) {
            debug('songbreakdownUpdateByUrl no url or sb', url, sb);
            return false;
        }
        debug('final url: ', url);
        $('ul#loader').show().siblings().not('.browseHeader').hide();
        $.getJSON(url, function(json) {
            $('ul#loader').hide().siblings().not('.browseHeader').show();
            //debug('get sonbreakdown update return', json);
            if(json.html) {
                sb.html(json.html);
                gs.campaign.songBreakdown(sb);
                gs.search.initCatalogSearch();
            } else {
                // error?
                debug('no html, throw error');
            }
        });
    };

    campaign.optionToggle = function(obj) {
        debug('options was toggled', obj, obj.checked);
        if(obj.checked) {
            $(obj).parent().parent().parent().addClass('active').find('.options').show();
        } else {
            $(obj).parent().parent().parent().removeClass('active').find('.options').hide();
        }
    }
    campaign.ageSliderInit = function(obj) {
        obj = obj || 'div.slider';
        var sliderId = 'handle'+(new Date()).getTime()+'-';
        $(obj).slider('destroy'); 
        debug('age slider', obj);
        $(obj).each(function(i) {
            var startValue = $(this).siblings('input.start').val();
            var endValue = $(this).siblings('input.end').val();
            debug('start end vals', startValue, endValue);
            var self = this;
            var ajaxTimeout;
            $('.ui-slider-handle', self).each(function(i) {
                debug('curr: '+i, this); 
                this.id = sliderId+i;
            })
            var sliderhandles = '#'+sliderId+'0,#'+sliderId+'1';
            debug('sliders: '+sliderhandles+', st: '+startValue, $(sliderhandles));
            setTimeout(function() {
                debug('create slider: ', self);
                $(self).slider({
                    min: 1,
                    max: 100,
                    range: true,
                    values: [startValue,endValue],
                    change: function(event, ui) {
                        debug('slider change',event, ui);
                    },
                    slide: function(event, ui) {
                        debug('slider slide');
                    },
                    stop: function(event, ui) {
                        debug('slider stop',event, ui);
                        clearTimeout(ajaxTimeout);
                        // put function when it stops here
                    }
                });
                // for some reason slider isn't giving me stop or other callbacks so create our own
                $('.handle', self).mouseup(function(){
                    clearTimeout(ajaxTimeout);
                    ajaxTimeout = setTimeout(function(){
                        var newStart = $(self).slider('value', 0);
                        var newEnd = $(self).slider('value', 1);
                        debug('mouseup new value:',newStart,newEnd, self);
                        gs.campaign.updateAgeMessage(newStart, newEnd);
                        // put function when it stops here
                    },500);
                }).mousemove(function(){
                    clearTimeout(ajaxTimeout);
                    ajaxTimeout = setTimeout(function(){
                        var newStart = $(self).slider('value', 0);
                        var newEnd = $(self).slider('value', 1);
                        debug('mousemove new value:',newStart,newEnd, self);
                        gs.campaign.updateAgeMessage(newStart, newEnd);
                        // put function when it stops here
                    },500);
                });
                // init slider value
                //$(self).slider('option', 'values',[startValue,endValue]);
                var width = $(self).width();
                var newLeftStart = parseInt(startValue * (width / 100));
                var newLeftEnd = parseInt(endValue * (width / 100));
                var newWidth = newLeftEnd - newLeftStart;
                $('.start.handle',self).css('left',newLeftStart+'px');
                $('.end.handle',self).css('left',newLeftEnd+'px');
                $('.ui-slider-range',self).css('left',newLeftStart+'px').css('width', newWidth+'px');
            }, 500);
        });
    };
    campaign.updateAgeMessage = function(start, end) {
        debug('new age start and end', start, end);
        $('#ageMessage .start').html(start);
        $('#ageMessage .end').html(end);
    }

    campaign.countrySelectChange = function(select) {
        if(select && select.value) {
            if(select.value == 'US') {
                $('dt.state').show();
                $('dd.state').show();
            } else {
                $('dt.state').hide();
                $('dd.state').hide();
            }
        }
    }

    campaign.adminSimArtistRemove = function(maraID, artistID, obj, useClass)
    {
        useClass = useClass || false;
        debug('sim artist remove: '+artistID, obj);
        if(useClass) {
            $(obj).parent().parent().parent().removeClass('active');
        } else {
            $(obj).parent().parent().parent().fadeOut();
        }
        // send ajax call
        var params = {command:'remove', id:artistID, maraid:maraID}
        
        $.getJSON('/promotion/editSimilarArtists.json', params, function(json) {
            // if in the add similar page, don't change the count b/c it's a global, not per account total 
            if(location.href.match('account/addSimilar')) {
                return false;
            }
            debug('edit sim artist return', json);
            var num = parseInt($('#browseTotalResults').html());
            $('#browseTotalResults').html(num-1);
        });
        return false;
    }

    campaign.adminSimArtistAdd = function(maraID, artistID, obj)
    {
        debug('sim artist add: '+artistID, obj);
        //$(obj).parent().parent().parent().fadeOut();
        $(obj).parent().parent().addClass('active');
        // send ajax call
        var params = {command:'update', id:artistID, value:75, maraid:maraID}
        $.getJSON('/promotion/editSimilarArtists.json', params, function(json) {
            debug('edit sim artist return', json);
        });
        return false;
    }
    campaign.adminSimArtistToggle = function(maraID, artistID, obj) {
        var container = $(obj).parent().parent().parent().get(0);
        debug(container);
        if($(container).hasClass('active')) {
            campaign.simArtistRemove(maraID, artistID, $('.details a.remove',container), true);
        } else {
            campaign.simArtistAdd(maraID, artistID, $('.details a.add',container));
        }
        return false;
    }

    campaign.adminSimArtistUpdate = function(maraID, artistID, weight, callback)
    {
        debug('sim artist update: '+artistID+'weight: '+weight);
        var params = {command: 'update', id: artistID, value: weight, maraid:maraID}
        $.getJSON('/promotion/editSimilarArtists.json', params, function(json) {
            debug('edit sim artist return', json);
            $('#sim-'+artistID).text(json.similarity).hide().show();
            // update the green bar, and similarity text
        });
    }

    campaign.adminSimArtistSlidersInit = function(maraID, obj) {
        obj = obj || 'div.slider';
        var sliderId = 'handle'+(new Date()).getTime()+'-';
        $(obj).slider('destroy'); 
        $(obj).each(function(i) {
            var startValue = $(this).siblings('input.similarity').val();
            var artistID = $(this).siblings('input.artistID').val();
            var self = this;
            var ajaxTimeout;
            $('.ui-slider-handle', self).each(function(i) {
                //debug('curr: '+i, this); 
                this.id = sliderId+i;
            })
            var sliderhandles = '#'+sliderId+'0,#'+sliderId+'1';
            //debug('sliders: '+sliderhandles+', st: '+startValue, $(sliderhandles));
            setTimeout(function() {
                $(self).slider({
                    stop: function(event, ui) {
                        debug('slider stop',event, ui);
                        clearTimeout(ajaxTimeout);
                        gs.campaign.adminSimArtistUpdate(maraID, artistID, ui.value);
                    }
                });
                // for some reason slider isn't giving me stop or other callbacks so create our own
                $('.handle', self).mouseup(function(){
                    $('.bar',self).css('width',$(self).slider('value')+'%');
                    clearTimeout(ajaxTimeout);
                    ajaxTimeout = setTimeout(function(){
                        var newVal = $(self).slider('value');
                        debug('new value:'+newVal, self, $('.bar',self).get(0));
                        gs.campaign.adminSimArtistUpdate(maraID, artistID, $(self).slider('value'));
                    },500);
                }).mousemove(function(){
                    $('.bar',self).css('width',$(self).slider('value')+'%');
                    clearTimeout(ajaxTimeout);
                    ajaxTimeout = setTimeout(function(){
                        var newVal = $(self).slider('value');
                        debug('new value:'+newVal, self, $('.bar',self).get(0));
                        gs.campaign.adminSimArtistUpdate(maraID, artistID, $(self).slider('value'));
                    },500);
                });
                // init slider value
                //$(self).slider('value',startValue);
                var width = $(self).width();
                var newLeft = parseInt(startValue * (width / 100));
                $('.handle',self).css('left',newLeft+'px');
            }, 500);
        });
    };

    campaign.toggleToCampaignForm = function(obj) {
        if(!obj) { return false; }
        obj = obj || false;
        if(!$(obj).length) { return false; }
        $(obj).parent().siblings('.addToCampaign').toggle().find('button.submit').removeAttr('disabled');
    }
    campaign.initAddToCampaignForm = function() {
        debug('addcampaignforms',$('.addToCampaign form').get());
        /*
        $('.addToCampaign form').submit(function() {
            gs.search.doCatalogSearch($('input.search.catalog',this).get());
            return false;
        });
        */
    }
    
    campaign.paymentChange = function(input) {
        input = $(input);
        debug(input.get(), !input.length);
        if(!input.length) { return false; }
        if(input.val()=='paypal') {
            debug('paypal payment change');
            $('#creditCardForm').hide();
        } else if(input.val()=='creditcard') {
            debug('creditcard change');
            $('#creditCardForm').show();
        }
    }
    
    campaign.addSong = function(songID, campaignID, anchor) {
        songID = songID || false;
        campaignID = campaignID || false;
        anchor = anchor || false;
        if(!songID || !campaignID) { return false; }
        var params = {songID:songID, campaignID:campaignID};
        $.getJSON('/campaign/addSongToCampaign.json', params, function() {
            debug('remove song from campaign return', json);
            if(anchor) {
                $(anchor).toggleClass('add').toggleClass('remove').parent().parent().removeClass('removed');
                anchor.onclick = function() { gs.campaign.removeSong(songID, campaignID, anchor); } 
            }
        });
            $(anchor).toggleClass('add').toggleClass('remove').parent().parent().removeClass('removed');
                anchor.onclick = function() { gs.campaign.removeSong(songID, campaignID, anchor); } 
    }
    campaign.removeSong = function(songID, campaignID, anchor) {
        songID = songID || false;
        campaignID = campaignID || false;
        anchor = anchor || false;
        if(!songID || !campaignID) { return false; }
        var params = {songID:songID, campaignID:campaignID};
        $.getJSON('/campaign/removeSongFromCampaign.json', params, function() {
            debug('remove song from campaign return', json);
            if(anchor) {
                $(anchor).toggleClass('add').toggleClass('remove').parent().parent().addClass('removed');
                anchor.onclick = function() { gs.campaign.addSong(songID, campaignID, anchor); } 
            }
        });
            $(anchor).toggleClass('add').toggleClass('remove').parent().parent().addClass('removed');
                anchor.onclick = function() { gs.campaign.addSong(songID, campaignID, anchor); } 
    }
    
    campaign.addArtist = function(artistID, campaignID, anchor) {
        artistID = artistID || false;
        campaignID = campaignID || false;
        anchor = anchor || false;
        if(!artistID || !campaignID) { return false; }
        var params = {artistID:artistID, campaignID:campaignID};
        $.getJSON('/campaign/addArtistToCampaign.json', params, function() {
            debug('add artist from campaign return', json);
            if(anchor) {
                $(anchor).toggleClass('add').toggleClass('remove').parent().parent().removeClass('removed');
                anchor.onclick = function() { gs.campaign.removeArtist(artistID, campaignID, anchor); } 
            }
        });
            $(anchor).toggleClass('add').toggleClass('remove').parent().parent().removeClass('removed');
                anchor.onclick = function() { gs.campaign.removeArtist(artistID, campaignID, anchor); } 
    }
    campaign.removeArtist = function(artistID, campaignID, anchor) {
        songID = songID || false;
        campaignID = campaignID || false;
        anchor = anchor || false;
        if(!songID || !campaignID) { return false; }
        var params = {songID:songID, campaignID:campaignID};
        $.getJSON('/campaign/removeSongFromCampaign.json', params, function() {
            debug('remove song from campaign return', json);
            if(anchor) {
                $(anchor).toggleClass('add').toggleClass('remove').parent().parent().addClass('removed');
                anchor.onclick = function() { gs.campaign.addSong(songID, campaignID, anchor); } 
            }
        });
            $(anchor).toggleClass('add').toggleClass('remove').parent().parent().addClass('removed');
                anchor.onclick = function() { gs.campaign.addSong(songID, campaignID, anchor); } 
    }
})();
