﻿function getHiddenActionInput(hiddenField, root) {
    return $('input[type="hidden"][id$="'+hiddenField+'"]',root);
}
//check if input of type hidden and id ending with the specified value exists or not
function isHiddenAction(hiddenField, root) {
    return ( getHiddenActionInput(hiddenField,root).size()>0 );
}
function ajaxActionOk(root, options) {
    var settings = {
        hiddenField: false,
        okFunc: false,
        endFunc: false,
        nokFunc: false,
        loadingParam: { img: '/common/images/loading.gif', align: 'center', mask: true },
        value: false,
        pageId: PageId
    }
    if ( options ) $.extend( settings, options);
    if ( settings.hiddenField ) 
        settings.value = getHiddenActionInput(settings.hiddenField,root).val();
    
    var rootData = {};
    if ( root ) { 
        root.loading(true, settings.loadingParam);
        rootData = root.data("actionOkParams");
    }
    var data = $.extend({},rootData,{ 
      value: settings.value, 
      id: settings.pageId 
    });
    jQuery.ajax({
      cache: false,
      dataType: 'text',
      data: data,
      error: function(jqXHR, textStatus, errorThrown) {
          alert("[ajaxActionOk::error] hiddenField is "+settings.hiddenField+", exception is: " + textStatus);
      },
      success: function (data, textStatus, jqXHR) {
        if ( data && data.substr(0,2)=="ok" ) {
            if (settings.okFunc ) {
                settings.okFunc.call(root,data.substr(2));
                //settings.okFunc(data.substr(2));
                //if widget with all actions has a callback set
                //by the parent container, then make sure to call it
                //on success, as the action might affect other elements
                //in parent container
                if ( root && root.data("actionOkCallback") )
                    root.data("actionOkCallback").call(root);
            }
          } else if ( settings.nokFunc )
            settings.nokFunc.call(root);
      },
      complete: function (jqXHR, textStatus) {
        if (root) root.loading(false);
        if (settings.endFunc) settings.endFunc.call(root);
      },
      /*type: 'POST',*/
      url: '/common/popups/action.aspx'
    });    
}
(function( $ ){
    $.fn.ajaxActionOk = function( options ) {  
        return this.each(function() {        
            var root = $(this);
            ajaxActionOk(root,options);
        });
    };
})( jQuery );

//wrapper for onActionOk
function onHiddenActionOk(hiddenField, callbacks, root, endFunc) {
    var func = {};
    if ( callbacks && typeof(callbacks) == "function" )
        func = {
            okFunc: callbacks, 
            endFunc: endFunc
        };
    else
        func = callbacks;
    var value = getHiddenActionInput(hiddenField,root).val();
    return onActionOk(PageId, value, func, root);
}
//if ajax response is "ok" then call the function
//callbacks supports: okFunc, nokFunc, endFunc
function onActionOk(pageId, value, callbacks, root) {
    var func = callbacks || {};
    return ajaxActionOk( root, {
        okFunc: func.okFunc,
        endFunc: func.endFunc,
        nokFunc: func.nokFunc,
        value: value,
        pageId: pageId    
    });
/*
    if ( root ) root.loading(true, { img: '/common/images/loading.gif', align: 'center', mask: true });
    var data = $.extend({},root.data("actionOkParams"),{ 
      value: value, 
      id: pageId 
    });
    var func = callbacks || {};
    jQuery.ajax({
      cache: false,
      dataType: 'text',
      data: data,
      error: function(jqXHR, textStatus, errorThrown) {
          alert("error: " + textStatus);
      },
      success: function (data, textStatus, jqXHR) {
          if ( data && data.substr(0,2)=="ok" ) {
            if (func.okFunc ) {
              func.okFunc(data.substr(2));
              //if widget with all actions has a callback set
              //by the parent container, then make sure to call it
              //on success, as the action might affect other elements
              //in parent container
              if ( root.data("actionOkCallback") )
                  root.data("actionOkCallback")();
            }
          } else if ( func.nokFunc )
            func.nokFunc();
      },
      complete: function (jqXHR, textStatus) {
        if (root) root.loading(false);
        if (func.endFunc) func.endFunc();
      },
      url: '/common/popups/action.aspx'
    });*/
}
(function( $ ){

  $.fn.enableViewMore = function( options ) {  

    var settings = {
      'listSelector': 'ul',
      'hiddenId': '',
      'fillDataList': function(){},
      'linkSelector': 'a.view-more'
    };

    return this.each(function() {        
        // If options exist, lets merge them
        // with our default settings
        if ( options ) { 
            $.extend( settings, options );
        }
        var root = $(this);
        // Tooltip plugin code here
        var link = $(settings.linkSelector, root);
        var pagecount = parseInt(link.attr("pagecount"));
        if ( isNaN(pagecount) ) pagecount = 0;
        var list = $(settings.listSelector, root);
        link.click(function() {
            var currentIndex = $(">li",list).size();
            root.data("actionOkParams",{startIndex:currentIndex});
            onHiddenActionOk(settings.hiddenId, {
                okFunc: function(data){
                    var dataList = [];
                    settings.fillDataList(data, dataList, currentIndex);
                    var itemsReturnedCount = dataList.length;
                    var i;
                    for(i=0; i<dataList.length; i++) {
                        list.append(dataList[i]);
                        $("div.mcConnectUser", dataList[i]).each(function(){
                            mcConnectUser($(this));
                        });
                        //call rateThis functionality
                        $("div.ThumbRatingBox", dataList[i]).each(function(){
                            ThumbRatingBox($(this));
                            setActionOkCallbackReload($(this));
                        });                
                    }
                    if ( pagecount>0 && itemsReturnedCount<pagecount ) {
                        link.unbind('click');
                        link.hide();
                    }
                },
                nokFunc: function() {
                    link.unbind('click');
                    link.hide();
                }
            },root);
        });

    });

  };
})( jQuery );

jQuery(function(){
    //enable the view-more link to fetch new items in the target list (ul)
    //the hidden id contains the code for server to generated required items
    //and fillDataList function processes the items to make them compatible 
    //with the format required: list items to be inserted in an ul
    /*
    function enableViewMore( root, listSelector, hiddenId, fillDataList) {
        var link = $("a.view-more", root);
        var pagecount = parseInt(link.attr("pagecount"));
        if ( isNaN(pagecount) ) pagecount = 0;
        var list = $(listSelector, root);
        link.click(function() {
            var currentIndex = $(">li",list).size();
            root.data("actionOkParams",{startIndex:currentIndex});
            onHiddenActionOk(hiddenId, {
                okFunc: function(data){
                    var dataList = [];
                    fillDataList(data, dataList, currentIndex);
                    var itemsReturnedCount = dataList.length;
                    var i;
                    for(i=0; i<dataList.length; i++) {
                        list.append(dataList[i]);
                        $("div.mcConnectUser", dataList[i]).each(function(){
                            mcConnectUser($(this));
                        });
                        //call rateThis functionality
                        $("div.ThumbRatingBox", dataList[i]).each(function(){
                            ThumbRatingBox($(this));
                            setActionOkCallbackReload($(this));
                        });                
                    }
                    if ( pagecount>0 && itemsReturnedCount<pagecount ) {
                        link.unbind('click');
                        link.hide();
                    }
                },
                nokFunc: function() {
                    link.unbind('click');
                    link.hide();
                }
            },root);
        });
    }
    */
        
//for a person, enable view more for list of liked persons
    $("div.persons-liked-box").enableViewMore({
        'listSelector': 'ul.persons-liked-list',
        'hiddenId': 'hiddenMoreLikedPersons',
        'fillDataList': function(data, dataList, currentIndex) {
            var droot = $("<ul>").append(data);
            $(">li",droot).each(function(){
                dataList.push($(this));
            });
        }   
    });
    /*
    each(function(){
        var root=$(this);
        enableViewMore(root, 
            "ul.persons-liked-list", 
            "hiddenMoreLikedPersons", 
            function(data, dataList, currentIndex) {
                var droot = $("<ul>").append(data);
                $(">li",droot).each(function(){
                    dataList.push($(this));
                });
            }
        );
    });
   */
    
//on a person page, when Update Tab is selected, enable View More button for 
//retrieving more UPDATES in the list using ajax
    $("div.person-other-tab.person-other-news").enableViewMore({
        listSelector: "div.more-on-this-container ul.more-on-this-items",
        hiddenId: 'hiddenMoreOther',
        fillDataList: function(data, dataList, currentIndex) {
            var droot = $("<div>").append(data);
            $(">div",droot).each(function(){
                dataList.push($("<li class=\"MoreOnThisItem"+(currentIndex++%2==1?"Alt":"")+"\">").append($(this)).append("<div class=\"clearer\"></div>"));
            });
        }        
    });
    /*each(function(){
        var root=$(this);
        enableViewMore(root, 
            "div.more-on-this-container ul.more-on-this-items", 
            "hiddenMoreOther", 
            function(data, dataList, currentIndex) {
                var droot = $("<div>").append(data);
                $(">div",droot).each(function(){
                    dataList.push($("<li class=\"MoreOnThisItem"+(currentIndex++%2==1?"Alt":"")+"\">").append($(this)).append("<div class=\"clearer\"></div>"));
                });
            }
        );
    });*/

//on a person page, when Like Tab is selected, enable View More button for 
//retrieving more content liked in the list using ajax
    $("div.person-other-tab.person-other-like").enableViewMore({
        listSelector: "div.more-on-this-container ul.more-on-this-items",
        hiddenId: 'hiddenMoreOther',
        fillDataList: function(data, dataList, currentIndex) {
            var droot = $("<div>").append(data);
            $(">div",droot).each(function(){
                dataList.push($("<li class=\"item"+(currentIndex++%2==1?"-alt":"")+"\">").append($(this)));
            });
        }
    });
    /*each(function(){
        var root=$(this);
        enableViewMore(root, 
            "div.listFlexible div.listResources div.list-items ul.items", 
            "hiddenMoreOther", 
            function(data, dataList, currentIndex) {
                var droot = $("<div>").append(data);
                $(">div",droot).each(function(){
                    dataList.push($("<li class=\"item"+(currentIndex++%2==1?"-alt":"")+"\">").append($(this)));
                });
            }
        );
    });*/

//for a person, enable wall link if needed
    $("div.ccPerson").each(function(){
        var root = $(this);
        var link = $("a.wallLink",root);
        if ( link.attr("href")=="javascript:void(0)" )
            link.click(function(){
                $.colorbox({html:"First time accessing Personal Corner. Please wait while it's being initialized."});
                onHiddenActionOk("hiddenWall",function(data){
                    if ( data.indexOf(".aspx") ) {
                        link.attr("href",data);
                        link.unbind('click');
                        window.location = data;
                    }
                },root, function(){
                    $.colorbox.close();
                });
            });
    });
//for each Connect User control enable asynchronous actions
    $("div.mcConnectUser").each(function(){
        mcConnectUser($(this));
    });
    function mcConnectUser(root) {
        if ( root.data("mcConnectUser")=="activated" ) return;
        root.data("mcConnectUser","activated");
      var spanPending = $("span.status_connect_pending", root);
      var linkConnect = $("a.action_connect", root);
      var linkCancel = $("a.action_cancel", root);
      var spanWaiting = $("span.status_connect_waiting", root);
      var spanSeparator = $("span.action_separator", root);
      var linkConfirm = $("a.action_confirm", root);
      var linkRefuse = $("a.action_refuse", root);
      var spanConnected = $("span.status_connected", root);
      var linkRemove = $("a.action_remove", root);
      linkConnect.click(function(){
          onHiddenActionOk("hiddenAsk", function(){
              spanWaiting.hide(); spanSeparator.hide(); linkConfirm.hide(); linkRefuse.hide(); spanConnected.hide(); linkRemove.hide();//make sure all other are hidden
              linkConnect.fadeOut('fast',function(){
                  linkCancel.fadeIn();
                  spanPending.fadeIn();
              });
          }, root);
      });
      linkCancel.click(function(){
          onHiddenActionOk("hiddenCancelAsk", function(){
              spanWaiting.hide(); spanSeparator.hide(); linkConfirm.hide(); linkRefuse.hide(); spanConnected.hide(); linkRemove.hide();//make sure all other are hidden
              spanPending.fadeOut('fast');
              linkCancel.fadeOut('fast',function(){
                  linkConnect.fadeIn();
              });
          }, root);
      });
      linkConfirm.click(function(){
          onHiddenActionOk("hiddenConfirm", function(){
              spanPending.hide(); linkConnect.hide(); linkCancel.hide(); //make sure all other are hidden
              spanWaiting.fadeOut('fast');
              spanSeparator.fadeOut('fast');
              linkRefuse.fadeOut('fast');
              linkConfirm.fadeOut('fast',function(){
                  linkRemove.fadeIn();
                  spanConnected.fadeIn();
              });
          }, root);
      });
      linkRefuse.click(function(){
          onHiddenActionOk("hiddenRefuse", function(){
              linkCancel.hide(); spanPending.hide(); spanConnected.hide(); linkRemove.hide();//make sure all other are hidden
              spanWaiting.fadeOut('fast');
              spanSeparator.fadeOut('fast');
              linkConfirm.fadeOut('fast');
              linkRefuse.fadeOut('fast',function(){
                  linkConnect.fadeIn();
              });
          }, root);
      });
      linkRemove.click(function(){
          onHiddenActionOk("hiddenRemove", function(){
              linkCancel.hide(); spanPending.hide(); spanWaiting.hide(); spanSeparator.hide(); linkConfirm.hide(); linkRefuse.hide();//make sure all other are hidden
              spanConnected.fadeOut('fast');
              linkRemove.fadeOut('fast',function(){
                  linkConnect.fadeIn();
              });
          }, root);
      });
    }
});

//custom functionality for person page that displays connections
    //for any connect user widget in connections list, add custom callback
    //to refresh the hole page as a change in status for a connection affects
    //the page
function setActionOkCallbackReload(root) {
    root.data("actionOkCallback", function(){
        location.reload();
    });
}    
jQuery(function(){
    setActionOkCallbackReload($("div.person-connections-box div.mcConnectUser,div.persons-liked-box div.ThumbRatingBox,div.content-liked-box div.ThumbRatingBox"));
})
