

var Top10Module = (function() {

  var listId,
      loginStatus,
      userId,
      username,
      network,
      provider,
      securityToken,
      userIdUrl,
      validList,
      initalList = [];

  var topTenContent,
      signInTools,            
      listInstructions,
      shareTools,
      draggableList,
      droppableList,
      saveButton,
      resetButton,
      deleteButton,
      createList,
      swaps = {},
      dataServer,
      swapLength = 0;

  /* Private methods */

  
  var userIsLoggedIn = function(){
  
    return loginStatus;

  };

  
  var isViewingList = function(){
    
    return userIdUrl; 
  };
  
  var isViewingOwnList = function(){
    return (userIdUrl == userId) && userId != ''; 
  };
  
  var validateList = function(){
    return validList;
  };
  
  
  var renderSignInTool = function(){
		if($('#'+signInTools).length  <= 0){
      topTenContent.before('<div id="'+signInTools+'"><span>Sign in:</span><ul><li class="yahoo" title="yahoo"><span>YAHOO</span></li><li class="google" title="google"><span>GOOGLE</span></li><li class="aim" title="aim"><span>AIM</span></li><li class="openid" title="openid"><span>OPENID</span></li></ul></div>');
    $('#'+signInTools).find('li').each(signInHandler); 

		}
    
  };

  
  var signInHandler = function(){

      var $this = $(this);
      var $signInTools =  $('#'+signInTools);
      var signInText = $signInTools.find('providerName').text();
        $this.bind('click',function(){
                var provider = $.trim($this.find('span').text());
                $.cookie('provider', provider);
                google.friendconnect.requestSignIn(provider);
       				return false;
        });
  }







  
  
  var showSaveButton = function(){
    $('<div id="#'+saveButton+'">').show()
  }


  var hideSaveButton = function(){
    $('<div id="#'+saveButton+'">').hide()
  }
  

  var renderSignOutTool = function() {
   $('#'+signInTools).hide();
    topTenContent.before('<div id="'+signOutTools+'"><span>sign out of '+provider+'</span></div>');
    $('#'+signOutTools+' span').bind('click',function(){
      google.friendconnect.requestSignOut();
      $.cookie('provider', null);
      window.location.reload();
      return false;
    });
  };
  
  var renderListInstructions = function(){
    $('#'+listInstructions).show();  
  };
  
  var renderSortableList = function() {


  topTenContent.find('#userTopTen').removeClass().addClass('editListMode');
  var li ='';
  
  var $droppableList = $('#'+droppableList);
    if(!$droppableList.length){
      
      //$.each(draggableList.find('li'),function(){
      for(var i =0,j = 10;i <10; i++ )
        li += '<li><span class="listText"/></li>';
      //});
      
      $('#userTopTen').append('<div id="'+droppableList+'"><ol>'+li+'</ol></div>');
      
      $droppableList = $('#'+droppableList);
      $droppableList.parent().parent().parent().find('.ad120').after('<div id="'+listInstructions+'" style="display:none">Drag an Item from the original list on the left into the area on the right to create your list.</div>');
      $droppableList.prepend('<h3>Your Top 10</h3>');
            
    }  
   
  }
  


  
  
  var initSortableBehavior = function(){
    var $droppableList = $('#'+droppableList);
    $droppableList.append('<div id="'+saveButton+'" style="display:none">Save & Share</div>');
    $droppableList.append('<div id="'+resetButton+'" style="display:none">Reset</div>')
    $('#'+saveButton).bind('click',saveHandler);
    $('#'+resetButton).bind('click',resetHandler);
  
    var draggableListLi = draggableList.find('li');
    var droppableListLi = $('#'+droppableList).find('li');    
    draggableListLi.each(function(){

      $(this).draggable({
  		  helper:'clone',
  		  opacity: 0.7
  		  
  		
  		}).hover(function(){$(this).addClass('dropHover')},function(){$(this).removeClass('dropHover')});
    });

    droppableListLi.droppable({
      hoverClass: 'dropHover',
      tolerance:'pointer',
      drop: function(event, ui) { 
      var dragLi = ui.draggable;
      var dropLi = $(this);
      var dragIndex = draggableListLi.index(dragLi);
      var dropIndex = droppableListLi.index(dropLi);
      
      swaps[dropIndex] = dragIndex;
       
      
      var dragText = dragLi.text();
      dropLi.find('span').append(dragText+'<span class="remove">X</span>').find('.remove').bind('click', function(){
        var $thisParent =  $(this).parent();
        $thisParent.empty();
        var thisIndex = droppableListLi.index($thisParent.parent());

        delete swaps[thisIndex];
        dragLi.draggable('enable');
        dropLi.droppable('enable');
        swapLength--;
        dragLi.find('a').show();
          dragLi.css('list-style-type','decimal');
        if(swapLength == 0){
          $('#'+saveButton).hide();
          $('#'+resetButton).hide();
        }
                 
      });
        dragLi.draggable('disable');
        dropLi.droppable('disable');
        dragLi.css('list-style-type','none');
        dragLi.find('a').hide();

      swapLength++
        if(swapLength == 1){
          $('#'+saveButton).show()
          $('#'+resetButton).show()
        }
      
      }
      
    });    
    
  };
  
  var saveHandler = function(){
    //TODO parametrize network
    var loginTools = $('#'+signInTools+' ul').html();
    var applySaveHandler = function(){
        $('#modalLogin').find('li').each(signInHandler);
    }

    
    if(userIsLoggedIn()){
    var network = 'fc';

   
    var url = dataServer + 'putlist?network='+network+
    '&provider='+provider+
    '&userid='+userId+
    '&name='+username+
    '&listid='+listId+
    '&swaps='+encodeURIComponent(gadgets.json.stringify(swaps))+
    '&token='+encodeURIComponent(securityToken)+
    '&callback=?';

    
    var getUrl = dataServer+'/getlist?userid='+userId+
              '&listid='+listId+
              '&network='+network+
              '&callback=?';
    
    var saveFunction = function(){
      $.jsonp({
        url: url,
        success: function() {              
					var l =  window.location.href;
					l = l.replace(/(.*html)\??.*/, '$1'+'?user='+userId+'&network='+network); 
					window.location = l; 
        
        },
        error: function(d,msg) {
          createModal('modalError','<p>'+msg+'</p>');
          renderModal('modalError');
        }
      });        
    
    };

      $.jsonp({
        url: getUrl,
        success:function(data){


            
            if(data.status){
            var applyOverWriteHandler = function(){
            var $overWriteOptions = $('#overWriteOptions');
            $overWriteOptions.find('.yesDelete').bind('click',saveFunction);
                $overWriteOptions.find('.noDelete').bind('click',function(){
         					var l =  window.location.href;
        					l = l.replace(/(.*html)\??.*/, '$1'+'?user='+userId+'&network='+network); 
        					window.location = l; 

                });            
    
            };            
            
           
            createModal('modalOverWrite','<p>You already have an exisiting list.  Are you sure you want to overwrite your current list?</h4><p><ul id="overWriteOptions"><li class="yesDelete">YES</li><li class="noDelete">NO</li></ul>',applyOverWriteHandler);
            renderModal('modalOverWrite');            
            
            
            }else{
              saveFunction();
            
            }
        },
        error: function(d,msg) {
          createModal('modalError','<p>'+msg+'</p>');
          renderModal('modalError');
        }
      
      });
    
   
     
      
    } else{
      createModal('modalLogin','<h4>To save & share, sign in with:</h4><ul>'+loginTools+'</ul>',applySaveHandler);
      renderModal('modalLogin');
    }    
    
    return false;
  };
  
  var resetHandler = function(){
    $('.remove').trigger('click');
    return false;
  }

  var deleteHandler = function(){  
 
  
    var url = dataServer + 'deletelist?userid='+userId
    + '&listid=' + listId
    + '&network=' + network
    + '&token='+encodeURIComponent(securityToken)
    + '&callback=?';

     $.jsonp({
      url: url,
      success: function() {
        var l =  window.location.href.replace(/(.*html)\??.*/, '$1');    
        window.location = l;  
      },      
      error: function(d,msg) {
        createModal('modalError','<p>'+msg+'</p>');
        renderModal('modalError');
      }
    });   
 
    return false;
  }

  var renderSavedList = function(){
      topTenContent.find('#userTopTen').removeClass().addClass('viewOtherListMode');
    initalList = [];
  
  
    draggableList.find('li').each(function(){
      initalList.push($(this).html());
    });
          
      var networkUrl = gup('network');
      var passInUserId = userIdUrl ? userIdUrl : userId;
      var url = dataServer + 'getlist?userid=' + passInUserId
    + '&listid=' + listId 
    + '&network=' + networkUrl   
    + '&callback=?';


    var $droppableList = $('#'+droppableList);
 
     $.jsonp({
      url: url,
      success: function(result) {
    
      var name =   (result.name.length >18) ? result.name.substring(0,17)+'...': result.name;
      $droppableList.find('h3').text(name+'\'s Ranked List "'+$('h1').text()+'"');
      $.each(result.swaps,function(i,data){
          
        $droppableList.find('li').eq(i).html(initalList[this]);
      });  
      },
      error: function(d,msg) {
        createModal('modalError','<p>'+msg+'</p>');
        renderModal('modalError');
      }
    });      
    
    

  
  };
  
  var renderCreateListLink = function(){
    var $droppableList = $('#'+droppableList);
    if(!$('#'+createList).length){
      $droppableList.prepend('<div id="'+createList+'">create list</div>');
      $('#'+createList).bind('click',function(){
        var l =  window.location.href.replace(/(.*html)\??.*/, '$1');    
        window.location = l;
        return false;
      
      })
    
    }
  
  }
  
  
  var renderViewerSavedList = function(){
    $('#'+createList).hide();
      topTenContent.find('#userTopTen').removeClass().addClass('viewUserListMode');
     var passInUserId = userIdUrl ? userIdUrl : userId;
      var url = dataServer + 'getlist?userid=' + passInUserId
    + '&listid=' + listId
    + '&network=' + gup('network')
    + '&callback=?';
    

    
    var getStatUrl = dataServer+ '/getstats?listid='+listId+'&callback=?';
    initalList = [];
    draggableList.find('li').each(function(){
      initalList.push($(this).html());
     
    });     

 

   
   $.jsonp({
    url: getStatUrl,
    success: function(result) {
      if(result.status){
        draggableList.find('li').each(function(){
          $(this).html('');
         
        });        
        $.each(result.order,function(i,data){
          if(result.stats[data[0]]){
            draggableList.find('li').eq(i).html(initalList[data[0]])   
          }
        });        
      }  

    },
    error: function(d,msg) {
      createModal('modalError','<p>'+msg+'</p>');
      renderModal('modalError');
    }
  });      
    

        
   var referUrl =  window.location.href;
  // var referUrl = l.replace(/(.*html)\?.*/, '$1'+'?user='+userId+'&network='+network);
   
   var title = encodeURI($('h1').text());  
   var draggableListParent = draggableList.parent();
   

/*BitlyApiClient.prototype.shorten = function(longUrl, callback_method_name) {
    return this.call('shorten', {'longUrl': longUrl}, callback_method_name);
};*/   
   /*function getTinyURL(longURL, success) {
   
      var API = 'http://json-tinyurl.appspot.com/?url=',
          URL = API + encodeURIComponent(longURL) + '&callback=?';
   
  	$.getJSON(URL, function(data){
      	success && success(data.tinyurl);
      });
   
  }*/
  
  
  /*var TweetThisLink = {
    shorten : function(event) {
        event.preventDefault();
        var twitter_url = this.getAttribute('href'),
			times_url = twitter_url.slice(50);
        BitlyClient.shorten(times_url, 'TweetThisLink.response');
    },
    response: function(data){
		var base_link = "http://twitter.com/home?status=reading+from+@time+";
		var bitly_link = null;
		for (var r in data.results) {
			bitly_link = data.results[r]['shortUrl'];
			break;
		}
		if(navigator.userAgent.indexOf('AppleWebKit') > -1 ) {
			window.location.href = base_link + encodeURIComponent(bitly_link);
		} else {
			window.open(base_link + encodeURIComponent(bitly_link));
		}
	}
};*/

    //getTinyURL(referUrl, function(tinyurl){
        // Do something with tinyurl:
    var BitlyClient = new BitlyApiClient();
    BitlyClient.shorten(referUrl, 'Top10Module.callBack');

    
    
    
    draggableListParent.find('h2').text('User Rankings');
    draggableListParent.addClass('fullListShareMode');
    var $droppableList = $('#'+droppableList);
 

    
    $droppableList.addClass('formListShareMode');
 
   $.jsonp({
    url: url,
    success: function(result) {
       var name =   (result.name.length >18) ? result.name.substring(0,17)+'...': result.name;
      $droppableList.find('h3').text(name+'\'s Ranked List "'+$('h1').text()+'"')
      
      
      $.each(result.swaps,function(i,data){
        
        $droppableList.find('li').eq(i).html(initalList[result.swaps[i]]);
      });
       
      
      $droppableList.append('<div id="'+deleteButton+'">delete</div>');
          
      $('#'+deleteButton).bind('click', function(){
          var deleteContent = '<p>Are you sure you want to delete your list?</p><ul id="deleteOptions"><li class="yesDelete">YES</li><li class="noDelete">NO</li></ul>';


        var applyDeleteHandler = function(){
        var $deleteOptions = $('#deleteOptions');
        $deleteOptions.find('.yesDelete').bind('click',deleteHandler);
            $deleteOptions.find('.noDelete').bind('click',function(){
            $('.close').trigger('click');
            });            

        };

          createModal('modalDelete',deleteContent,applyDeleteHandler);
          renderModal('modalDelete');  

      
      });  
    },
    error: function(d,msg) {
      createModal('modalError','<p>'+msg+'</p>');
      renderModal('modalError');
    }
  });   
  
  };
  
  var renderShareTools = function(){
    shareTools.show();
  }
  
  var renderDeleteButton = function(){
    deleteButton.show();
  }
  


  return {

    init: function(config,initValues) {
      		
          listId        = $.trim(initValues.listId);
          loginStatus   = initValues.loginStatus;
          securityToken = initValues.securityToken;
          userId        = initValues.userId;
          username      = initValues.username;
          userIdUrl        = initValues.userIdUrl;
          createList      = initValues.createList;
          validList       = initValues.validList;
          network         = initValues.loginStatus ? initValues.network :null ;
          provider        = initValues.provider;
          
     
          
          
          topTenContent           = $('.'+config.topTenContent);
          signInTools             = config.signInTools;
          signOutTools            = config.signOutTools;          
          listInstructions        = config.listInstructions;
          shareTools              = config.shareTools;
          draggableList           = $('#'+config.draggableList+' ol'); 
          droppableList           = config.droppableList;
          saveButton              = config.saveButton;
          resetButton             = config.resetButton;
          deleteButton            = config.deleteButton;
          dataServer              = config.dataServer;
          createList              = config.createList;

 
    

          if (userIsLoggedIn()){
          
            renderSignOutTool();

            
            // viewing a list determine by user param in the query string or user viewing his own list
            if(isViewingList()){
            
              if(isViewingOwnList() && validateList() ){
                      renderSortableList(); 
                      renderViewerSavedList();
                      $('#modalOverLay').hide();
                    
                } else {
                  if (validateList()){
                    renderSortableList(); 
                    renderSavedList();
                    renderCreateListLink();

                  } else{
                    createModal('modalinvalid','<p>You are looking at an invalid list</p>');
                    renderModal('modalinvalid');
                  }
                  
                }
            } else {
            
                renderSortableList();
                renderListInstructions();   
                initSortableBehavior();
            }
            $('#modalLogin').hide(function(){
              $('#'+saveButton).trigger('click');
             
            });            
            
          } else{

            renderSignInTool(); 
            if(isViewingList()){
             if (validateList()){
    
                    renderSortableList();
                    renderSavedList();
                    renderCreateListLink();
                    

              } else{
                createModal('modalinvalid','<p>You are looking at an invalid list</p>');
                renderModal('modalinvalid');               }
            } else{
              
              
              renderSortableList();
              
              
              renderListInstructions();   
              initSortableBehavior();
            }
          }
      

    },
    callBack : function(data){
		var referUrl,tinyUrl;
		for (var r in data.results) {
			tinyUrl = data.results[r]['shortUrl'];
			referUrl = r;                        
                        
			break;
		}
		
		
    	var draggableListParent =$('#fullList'),
		title = encodeURI($('h1').text());
        draggableListParent.prepend('<strong>Thanks!</strong><p>Share your list with friends:</p><ul id="shareTools"><li class="email"><a href="http://pathfinder.com/r0/venue/partner/out?/cgi-bin/mail/mailurl2friend.cgi?path=/time/emailFriend&url='+escape(referUrl)+'&group=time&title=My '+title+' - TIME">email</a></li><li class="facebook"><a href="http://www.facebook.com/sharer.php?u='+tinyUrl+'&t='+title+'">Facebook</a></li><li class="twitter"><a href="http://twitter.com/home?status=check out the top 10 list I created @time'+title+'%20@Time%20'+tinyUrl+'" target="_blank">Twitter</a></li><li class="getLink"><span>Get Link</span></li></u>'); 		
       
        draggableListParent.find('.facebook a').timePopUp({height : 436, width: 626});	
        draggableListParent.find('.email a').timePopUp({height : 730, width: 750});
        var getLinkContent = '<textarea readonly="readonly">'+referUrl+'</textarea>';
        var applyGetLinkHandler = function(){
              $('#getLink').find('textarea').bind('click',function(){this.select();});
        }
        createModal('getLink','<p>Copy the link below to send to a friend:</p>'+getLinkContent,applyGetLinkHandler);
    
        draggableListParent.find('.getLink span').bind('click',function(){
            renderModal('getLink'); 
        });
        
    }
  }
})();


  // return query param value of name
  function gup( name ){
    var regexS = '[\\?&]'+name+'=([^&#]*)';
    var regex = new RegExp( regexS );
    var results = regex.exec( window.location.href);
      if( results == null ){
        return null;
      } else{
        return results[1];
      }
  };		

  function createModal(id,content,applyFunction){
    var $modalOverLay = $('#modalOverLay');
    
    
    if(!$modalOverLay.length){
      $('<div id="modalOverLay" style="display:none;"/>').appendTo('#userTopTen');
      $modalOverLay = $('#modalOverLay');
    }
    if(!$('#'+id).length){
      $('<div id="'+id+'" class="modal" style="display:none;"><span class="close">close</span>'+content+'</div>').appendTo('#userTopTen');
      $('.close').bind('click',function(){
        $modalOverLay.hide();
        $(this).parent().hide();
      });
      if(applyFunction){
        applyFunction();
      }
         
    }
  }

  function renderModal(id){
    var $modalOverLay = $('#modalOverLay');
     var IE6 = false /*@cc_on || @_jscript_version < 5.7 @*/;  
     if(IE6)  
     {  
      var offSetHeight = $modalOverLay.parent().innerHeight();
      $modalOverLay.css('height',offSetHeight);
     }  

    
    $modalOverLay.show();
    $('#'+id).show();
    window.scroll(0,0);
  }





	function initAllData(securityToken) {
		
    socialList = {};
    socialList.securityToken = securityToken;
    socialList.listId = $("meta[name='listid']").attr('content');
    socialList.loginStatus = false;  
    socialList.userIdUrl = gup('user');
    socialList.viewingMyList = false;
    socialList.validList = false;
    socialList.provider  = $.cookie('provider');
    socialList.network = 'fc';
    
    var networkUrl = gup('network');
    var req = opensocial.newDataRequest();
    req.add(req.newFetchPersonRequest('VIEWER'), 'viewer_data');
    var sendResquest;
    


    if(socialList.userIdUrl && socialList.listId){
      var url = 'http://time-social.appspot.com/getlist?userid='+socialList.userIdUrl+
                '&listid='+socialList.listId+
                '&network='+networkUrl+
                '&callback=?';

    $.jsonp({
      url: url,
      success: function(data) {
          socialList.validList = data.status;
          
         req.send(onData);
      },
      error: function(d,msg) {
        createModal('modalError','<p>'+msg+'</p>');
        renderModal('modalError');
      }
    });  
     }
    else {
     req.send(onData);

    }

     
  };
  
	function onData(data) {
	
    var config = {};
    config.topTenContent = 'topTenContent'
    config.signInTools  = 'signInTools';
    config.signOutTools = 'signOutTools';
    config.shareTools   = 'shareList';    
    config.listInstructions = 'listInstructions';
    config.draggableList    = 'fullList';
    config.droppableList    = 'formList';
    config.saveButton = 'saveShare';
    config.resetButton = 'resetButton';
    config.createList = 'createList';
    config.deleteButton = 'deleteButton';    
    config.dataServer = 'http://time-social.appspot.com/';
    if((socialList.userIdUrl == socialList.userId)&&(socialList.userIdUrl != '')){
      socialList.viewingMyList = true;
    } 

    var viewer = data.get('viewer_data');
      if (!viewer.hadError()){
          var viewerData = viewer.getData();
          socialList.loginStatus =  $.cookie('provider') ? true : false;
          socialList.username = viewerData.getField('displayName');
          socialList.userId = viewerData.getId();
          Top10Module.init(config,socialList);
      } else{
        Top10Module.init(config,socialList);
      }
  };