/*global $, window, FB */
var ELISAVIIHDE = ELISAVIIHDE || {};

$(function () {
	// DOM ready
	var html = $("html");
		
	ELISAVIIHDE.core = {
	    checkLogin: function(trueCallback, falseCallback) {
            $.ajax({
                url: "login.sl?islogged",
                dataType: "text",
                cache: false,
                async: "false",
                success: function(resp, status) {
                    if (resp === "TRUE") {
                    	if(trueCallback) {
                    		trueCallback();
                    	}	
                    } else {
                    	if(falseCallback) {
                    		falseCallback();
                    	}
                        
                    }
                }
            });	        
	    },
		vod: function() {
			function addToFavorites(vodID) {
				$.ajax({
					url: "vod.sl",
					processData: false,
					data: "action=true&addfavorite="+vodID,
					dataType: "text",
					cache: false,
					success: function(resp, status) {
						if (resp === "OK") {
							//console.log("vod lisätty suosikkeihin")
						} else {
							//console.log("lisäämisessä tapahtui virhe");
							//alert(resp);
						}
					}
				});
				return false;
			}
			
			$(".cover_list").delegate("a", "click", function() {
				location.href = $(this).attr("href");
				return false;
			});
			
			$(".cover_list .fav_link").delegate("span", "click", function() {
				var conf ={
					not_fav:{
						fav_class: "vod_fav_add",
						fav_text: $(this).attr("data-addFav")
					},
					fav:{
						fav_class: "vod_fav_remove",
						fav_text: $(this).attr("data-remove")				
					}
				}
				var vodID = $(this).parent(".fav_link").attr("data-vod-id"),
				url = "", text;
				var element = $(this);
				
				if($(element).hasClass("vod_fav_add") == true) {
					text = conf.fav.fav_text;
					url = "vod.sl?action=true&addfavorite=" + vodID;
				} else {
					text = conf.not_fav.fav_text;
					url = "vod.sl?action=true&removefavorite=" + vodID;
					deleteVod = true;
				}
				
				$.ajax({
			  		type: "GET",
			  		url: url,
			  		cache: false,
			  		success: function(msg) {
			  		    if($("div.content").hasClass("favorite_vod") && deleteVod){
			  		      if($(element).closest("li").siblings("li").length > 0){
			  		        $(element).closest("li").remove();
			  		      }else{
			  		        window.location.reload(true);
			  		      }  
			  		      
			  		    }else{
	                        $(element).text(text);
	                        $(element).toggleClass(conf.fav.fav_class).toggleClass(conf.not_fav.fav_class); 
			  		    }
			  		},
			  		error: function(msg){}
				});
				
				return false;
			});
			
			$("a.vod_fav_remove, a.vod_fav_add").live("click", function() {
				var link = $(this),
				url = link.attr("href");
				
				$.ajax({
			  		type: "GET",
			  		url: url,
			  		cache: false,
			  		success: function(msg) {
			  			location.href = location.href;
			  		},
			  		error: function(msg) {}
				});
				
				return false;
			});
		},
			
		init: function() {
			html.removeClass("no-js");
			if (html.attr("class").length === 0) {
				html.removeAttr("class");
			}
			
			if ( $.browser.msie ) {
		        $("label img").live("click", function() {
		            $("#" + $(this).closest("label").attr("for")).trigger("click").trigger("change");
		        });
		    }			
			
			$(".need-js").show();
			
			
			/* Login popup */
			$("a.login, #programdata .submit_btn a").live("click", function() {
				var url = $(this).attr("href"); 
				if($("body").attr("data-login") === undefined){
				    ELISAVIIHDE.login.initAjaxLogin(url);
				}
				
				$("a.login").colorbox({ 
					open: true, 
					title: $("#login_dialog").attr("title"), 
					opacity: 0.4, 
					width: 382, 
					transition: "none", 
					inline: true, 
					href: "#login_dialog",
					onComplete: function() {
						setTimeout(function() {
							$.colorbox.resize();
							uname=$("#username");
				            if (uname.attr("value") == null || uname.attr("value") == "") {
				                uname.focus();
				            } else {
				                $("#password").focus();
				            }							
						}, 200);
					}				
				});
								
				return false;
			});
			
			/* Sipoo dummy functionality */
			$(".sipoo a.sipoo_layer1").live("click", function() {
			    var element = $("div.sipoo_layer1");
				$("div.sipoo_layer2").hide().attr("aria-hidden", true);
				$(element).toggle().attr("aria-hidden", $(element).is(":visible") ? false : true);
				return false;
			});
			$(".sipoo a.sipoo_layer2").live("click", function() {
			    var element = $("div.sipoo_layer2");
				$("div.sipoo_layer1").hide().attr("aria-hidden", true);
				$(element).toggle().attr("aria-hidden", $(element).is(":visible") ? false : true);
				return false;
			});
			
			$(".sipoo_close").live("click", function() {
				$(".sipoo_layer").hide().attr("aria-hidden", true);
			});
			
			 $(document).bind('click', function(e) {
			     if($(e.target).not('.collapsible')  && $(e.target).not('.collapsible_target') && $(e.target).closest('.collapsible_target').length === 0){
			         $(".collapsible_target:visible").not($(e.target).next('.collapsible_target')).not($(e.target).closest('.collapsible').next('.collapsible_target')).hide().attr("aria-hidden", true);
			     }
			     
			 });
			 
            try {
                FB.init({
                    logging: false,
                    status: false,
                    xfbml: true
                });
            } catch (error) {
                // Fail silently
            }

			
		},

    karaoke: {
      init: function () {
        this.initKaraokeSearch();
        if (this.loggedInAndOnKaraokePage()) {
          this.toggleFavoritesInSongLists();
        }
      },

      loggedInAndOnKaraokePage: function () {return $('.karaoke').hasClass('loggedIn');},

      toggleFavoritesInSongLists: function () {

        initFavoriteToggle();

        function initFavoriteToggle() {$('.songList, #karaokeSearchResults').delegate('.song .favorite', 'click', ajaxChangeFavorite);}
        function ajaxChangeFavorite() {
          var elem = $(this).closest('.song');
          $.get('vod.sl', paramsForFavoriteChange(elem))
            .success(function(response) {
              elem = $(elem);
              if (response === 'OK') {
                toggleAllSongsWithSameId(elem);
                if (onKaraokeFrontPage()) {
                  handleKaraokeFrontPageSongListFavoriteToggle(elem);
                }
              }
            });
        }
        function toggleAllSongsWithSameId(elem) {$('.song[data-vod-id="' + elem.data('vod-id') + '"]').toggleClass('favorite');}
        function paramsForFavoriteChange(elem) {
          var params = {action: 'true'};
          var command = $(elem).hasClass('favorite')? 'removefavorite': 'addfavorite';
          params[command] = $(elem).data('vod-id');
          return params;
        }
        function onKaraokeFrontPage() {return $('.col.popular')}
        function handleKaraokeFrontPageSongListFavoriteToggle(elem) {
          if (wasMadeFavorite(elem)) {
            removePlaylistHelp();
            addToMyPlaylistElem(elem);
          } else {
            markPopularSongAsNotFavorite(elem);
            removeFromMyPlaylistElem(elem);
          }
        }
        function wasMadeFavorite(elem) {return elem.hasClass('favorite');}

        function addToMyPlaylistElem(elem) {
          var wasInserted = addBeforePrecedingElementInAlphabets(elem);
          if (!wasInserted) {
            addAsLastItemInPlaylist(elem);
          }
        }
        function removePlaylistHelp() {$('.myPlaylist p').remove();}
        function addBeforePrecedingElementInAlphabets(elem) {
          var playlistSong = $('.myPlaylist .song').first();
          while (playlistSong.length) {
            if (artistIsBeforeInAlphabets(elem, playlistSong) || artistsMatchAndSongNameIsBeforeInAlphabets(elem, playlistSong)) {
              elem.clone().insertBefore(playlistSong);
              break;
            }
            playlistSong = playlistSong.next()
          }
          return playlistSong.length;
        }
        function addAsLastItemInPlaylist(elem) {$('.myPlaylist').append(elem.clone());}
        function artistIsBeforeInAlphabets(elem, playlistSong) {return $('.artist', elem).text() < $('.artist', playlistSong).text();}
        function artistsMatchAndSongNameIsBeforeInAlphabets(elem, playlistSong) {
          return ($('.artist', elem).text() == $('.artist', playlistSong).text() && $('.title', elem).text() < $('.title', playlistSong).text());
        }
        function markPopularSongAsNotFavorite(elem) {$('.song[data-vod-id="' + elem.data('vod-id') + '"]').removeClass('favorite');}
        function removeFromMyPlaylistElem(elem) {$('.myPlaylist .song[data-vod-id="' + elem.data('vod-id') + '"]').remove();}
      },

      initKaraokeSearch: function () {
        var songTemplate
         , noResultsTemplate
         , searchResults = '#karaokeSearchResults'
         , song = searchResults + ' .song'
         , searchForm = '.karaoke .search'
         , searchField = searchForm + ' .searchField'
         , searchOffset = searchForm + ' input[name="offset"]'
         , clearButton = searchForm + ' input[type="reset"]'
         , currentSearch
         , searchTimer
         , timeoutForWaitAnimationInMs = 500
         , throttleTimeoutInMs = 150
         , infiniteScrollingThresholdInPx = 600
         , alreadyFetchedAllForCurrentSearch = false;
        ;

        initSearch();

        function initSearch() {
          songTemplate = $(song + ':first').remove();
          noResultsTemplate = $(song + '.noResults').remove();

          $(clearButton).bind('click', resetSearchForm);
          $(searchForm).bind('submit', searchViaForm);
          $(searchField).bind('keyup', throttle(searchViaKeyUp, throttleTimeoutInMs));
          $(searchResults).bind('scroll', searchViaScroll);

          $(searchOffset).val(0);
          $(searchField).val('');
        }
        function resetSearchForm() {hide(clearButton); hide(searchResults);}
        function searchViaForm(event) {
          event && event.preventDefault();
          searchFirstBatch();
        }
        function searchViaKeyUp(event) {
          var key = event.charCode || event.keyCode;
          if (key || key === 0) {searchFirstBatch();}
        }
        function searchFirstBatch() {
          $(searchOffset).val(0);
          if (currentSearch) {hideAjaxSpinner(); currentSearch.abort();}
          searchSongs();
        }
        function searchViaScroll(event) {
          if (isOverScrollThreshold(this)) {
            if (currentSearch) {return;}
            if (alreadyFetchedAllForCurrentSearch) {return;}
            searchSongs();
          }
        }
        function isOverScrollThreshold(elem) {return (elem.scrollHeight - $(elem).scrollTop() - $(elem).height()) < infiniteScrollingThresholdInPx;}
        function searchSongs() {
          if (!$(searchField).val()) {clearResults(); return;}
          showAjaxSpinner();
          currentSearch = getJson();
          currentSearch.success(showResults);
        }
        function getJson() {
          var form = $(searchForm);
          return $.ajax({url: form.attr('action'), data: form.serialize(), dataType: 'json'})
        }
        function showResults(response) {
          if (toInt(response.offset) === 0) {
            showFirstBatchOfResults(response);
          } else {
            showMoreResultsOnScrolling(response);
          }
          $(searchOffset).val(toInt(response.offset) + response.vods.length);
          show(clearButton);
        }
        function showFirstBatchOfResults(response) {
          clearResults();
          addNewResults(response);
          show(searchResults);
          resetResultsElemScrollbar();
        }
        function showMoreResultsOnScrolling(response) {
          currentSearch = null;
          hideAjaxSpinner();
          addNewResults(response);
          show(searchResults);
        }
        function toInt(x) {return +x;}
        function clearResults() {
          currentSearch = null;
          alreadyFetchedAllForCurrentSearch = false;
          $(searchOffset).val(0);
          hide(searchResults);
          hide(clearButton);
          removeOldResults(song);
          hideAjaxSpinner();
        }
        function showAjaxSpinner() {searchTimer = setTimeout(function () {$(searchForm).addClass('wait');}, timeoutForWaitAnimationInMs);}
        function hideAjaxSpinner() {
          clearTimeout(searchTimer);
          $(searchForm).removeClass('wait');
        }
        function resetResultsElemScrollbar() {$(searchResults).scrollTop(0);}
        function removeOldResults(song) {$(song).remove();}
        function addNewResults(response) {
          if (response.vods.length) {
            addVods(response);
          } else if (toInt(response.offset) === 0) {
            showNoResults(response.searchTerm);
          } else {
            alreadyFetchedAllForCurrentSearch = true;
          }
        }
        function addVods(response) {
          var results = $(searchResults), vods = response.vods, searchTerm = response.searchTerm;
          for (var i = 0, length = vods.length; i < length; i++) {
            results.append(createSongElem(vods[i], searchTerm));
          }
        }
        function createSongElem(vod, searchTerm) {
          var elem = songTemplate.clone();
          elem.attr('data-vod-id', vod.id);
          if (vod.isFavorite) {
            elem.addClass('favorite');
          }
          highlightElem(elem, vod, searchTerm);
          return elem;
        }
        function highlightElem(elem, vod, searchTerm) {
          var highlightText = $.trim(searchTerm);
          $('.artist', elem).html(highlight(vod.artist, highlightText));
          $('.title', elem).html(highlight(vod.title, highlightText));
          $('.song-id', elem).html('(' + highlight(vod.id, highlightText) + ')');
        }
        function highlight(txt, partToHighlight) {
          return txt.replace(new RegExp(partToHighlight, 'gi'), '<em>$&</em>');
        }
        function showNoResults(searchTerm) {
          var elem = noResultsTemplate.clone();
          elem.find('.searchTerm').html(searchTerm);
          $(searchResults).append(elem);
        }
        function hide(elem) {return $(elem).hide();}
        function show(elem) {return $(elem).show();}
        function throttle(fn, delay) {
          var timer = null;
          return function () {
            var context = this, args = arguments;
            clearTimeout(timer);
            timer = setTimeout(function () {
              fn.apply(context, args);
            }, delay);
          };
        }
      }
    }
	};

	ELISAVIIHDE.core.init();
	ELISAVIIHDE.core.vod();
	ELISAVIIHDE.core.karaoke.init();
});
