/* ################################################################# */
/*                                                                   */
/*  TITLE:        NBC_MOMENT_UTILITY.JS                              */
/*  LAST UPDATED: 11/2/2009                                           */
/*  UPDATED BY:   Stanley Kubasek                                    */
/*                                                                   */
/*  NAMESPACE:                                                       */
/*    NBC_MomentUtils                                                */
/*    NBC_MomentUtil                                                 */
/*    NBC_MomentUploadUtil                                           */
/*                                                                   */
/*  PREREQUISTES/DEPENDENCY:                                         */
/*    user                                                           */
/*    nbc                                                            */
/*    U.log                                                          */
/*    mmt.showPreview                                                */
/*                                                                   */
/*  @release 2009-11-03 stanley - hot fix for new lookup             */
/* ################################################################# */

/**
 * NBC_MomentUtils -- moment utils
 */
var NBC_MomentUtils = {};
NBC_MomentUtils.rateUp = function(momId, momField) {
  U.log("moment: rating up [" + momId + "]");
  NBC_MomentUtils.rate(momId, momField, 2.0);
};

NBC_MomentUtils.rateDown = function(momId, momField) {
  U.log("moment: rating down [" + momId + "]");
  NBC_MomentUtils.rate(momId, momField, 1.0);
};

NBC_MomentUtils.rate = function(momId, momField, rating) {
  var self = this;
  
  var cMmt = nbc.moment["mmt" + momId];
  if( !cMmt.rated ){
	  // remove on append if already voted and then append a classname with ("On")
	  $(".momentFeelHateMid a").removeClass("momentDetailPageUpOn");
	  $(".momentFeelHateMid a").removeClass("momentDetailPageDownOn");
	  momField.className = momField.className + " " + momField.className + "On";  
	  NBC_MomentUtils.updateRating(momId, momField, rating, cMmt);
	  
	  var token = user.token || "&anon=y";
	  var queryString = "action=rate&id=" + momId + "&rating=" + rating + "&token=" + token + "&r=" + Math.random(); 
	  jQuery.getJSON("/i/dispatcher/?h=moment", queryString, function(data) {
	    if (data.ka.status != 1) {
	      U.log("moment_util: Error rating moment [" + momId + "]. " + data.ka.error);
	    }
	    else {
	      U.log("moment_util: rated successfully");
	    }
	  });  
  }  
};

NBC_MomentUtils.updateRating = function(momId, momField, rating, cMmt) {
  var isUp = true;	  
  var ratingPercent;
  if (cMmt.voteCount == 0) {
    ratingPercent = 100;	    
    if (rating == 1) {
      isUp = false;
    }
  }
  else {
    // formula
    // (avgRating * voteCount + rating)/(voteCount + 1)
	  U.log("moment_util: original rating: " + cMmt.avgRating);
    var ratingSum = parseFloat((cMmt.voteCount * cMmt.avgRating));
    var newRating = (ratingSum + parseInt(rating, 10)) / (parseInt(cMmt.voteCount, 10) + 1);
    U.log("moment_util: updated rating: " + newRating);
    
    ratingPercent = parseFloat(newRating - 1.0) * 100;
    U.log("moment_util: rating in percent: " + ratingPercent);
    
    if( ratingPercent == 0 ) {
      ratingPercent = 100;
      isUp = false;
    } else if (ratingPercent > 100) {
      ratingPercent = 100;
    } else if( ratingPercent < 50 ) {
      if( ratingPercent < 0 ) {
        ratingPercent = 100;
      } else {
        U.log("moment_util: rating is negative");
        ratingPercent = 100 - ratingPercent;
        isUp = false;
      }
    }	    
  }
  
  $momFieldParent = $(momField).parent().parent().parent();
  $momFieldParent.find(".momentPercentMid,.momentRatingNumber").text(Math.round(ratingPercent));
  if (isUp) {
    $momFieldParent.find(".momentThumbRatingMid").removeClass("red").addClass("green");
  } else {
    $momFieldParent.find(".momentThumbRatingMid ").removeClass("green").addClass("red");    
  }
  cMmt.rated = true;
};

NBC_MomentUtils.flag = function(momId, momField) {
  var self = this;

  if (!NBC_UserOverlay.validateLogin(1)) {
    return false;
  }
  
  if (typeof momId !== "undefined") {
    var token = user.token;
    var queryString = "action=flag&id=" + momId + "&token=" + token;
    jQuery.getJSON("/i/dispatcher/?h=moment", queryString, function(data) {  
      $(momField).removeClass("momentFlagIt");
      $(momField).addClass("momentFlagItOn");  
      if (data.ka.status == 1) {
        U.log("moment_util: Moment [" + momId + "] flagged.");
      }
      else {
        U.log("moment_util: Error flagging moment [" + momId + "]. " + data.ka.error);
      }
    });
  }
  else {
    U.log("WARNING: moment_util: momId not specified");
  }
};


NBC_MomentUtils.reject = function(mmtId, photoId) {
  var self = this;

  if (!NBC_UserOverlay.validateLogin(1) || !user.isEditor()) {
    U.log("User either not logged it or not an editor.");
    return false;
  }
  
  // MOMENT REJECT
  var queryString = "action=reject&id=" + mmtId + "&mediaType=blog" + 
      "&token=" + user.token;
  U.log("Rejecting moment... id [" + mmtId + "]");
  $("#rejectLink").hide();  
  var statusMsg = "";
  var success = false;
  jQuery.getJSON("/i/dispatcher/?h=moment", queryString, function(data) {
    if (typeof data.ka !== "undefined" && data.ka.status == 1) {
      success = true;
      statusMsg = "Success: Moment Rejected. ";
      U.log(statusMsg);
    } 
    else { // error occured
      if (typeof data.ka !== "undefined" && typeof data.ka.message !== "undefined") {
        statusMsg += " Error: Failed to reject moment: " + data.ka.message;
      }
      else if (typeof data.error !== "undefined") {
        statusMsg += " Error: Failed to reject moment: " + data.error;
      }
      else {
        statusMsg += " Error: Reject moment failed.";
      }
    }
        
    // PHOTO REJECT
    if (photoId && success) {
      U.log("Rejecting moment's photo... id [" + photoId + "]");      
      queryString = "action=reject&id=" + photoId + "&mediaType=photo" + 
          "&token=" + user.token;
      jQuery.getJSON("/i/dispatcher/?h=moment", queryString, function(data2) {
        if (typeof data2.ka !== "undefined" && data2.ka.status == 1) {
          statusMsg += " Photo Rejected. ";
          U.log(statusMsg);
        }
        else { // error occured
          if (typeof data2.ka !== "undefined" && typeof data2.ka.message !== "undefined") {
            statusMsg += " Error: Failed to reject photo: " + data2.ka.message;
          }
          else if (typeof data2.error !== "undefined") {
            statusMsg += " Error: Failed to reject photo: " + data2.error;
          }
          else {
            statusMsg += " Error: Reject photo failed.";
          }
        }
        U.log("moment_util.reject: " + statusMsg);
        $("#momentAdminMsg").text(statusMsg).css("visibility", "visible");           
      });
    }
    else { // error occured or no photo
      U.log("moment_util.reject: " + statusMsg);
      $("#momentAdminMsg").text(statusMsg).css("visibility", "visible");         
    }
  });  
};


/**
 * NBC_MomentUtil
 * 
 * Responsible for image upload.
 * Note: NBC_MomentUploadUtil does the actual uploading.
 */
var NBC_MomentUtil = function() {
  var PHOTO_BASE = "http://media.kickstatic.com/kickapps/images/";

  var retryMax = 5, 
    retryCount = 0,
    retryPreviewCount = 0;
    found = false,
    photoInserted = false,
    stopRequested = false;
  
  var initImageUpload = function() {
    $(document).ready(function() {
      $("#resetPhotoUpload, #momentImageUploadReset").click(function() {
        resetPhotoUpload();
        $("#momentImageUploadBtn").hide();
      });
      $("#momentPhotoUpload .momentUploadPhoto").click(function() {
        if (!NBC_UserOverlay.validateLogin()) {
          return;
        }
        
        document.getElementById("photoUploadiFrame").innerHTML = "<iframe id='uploadBtnRemote' src='/somycity/upload_photo/' marginheight='0' marginwidth='0' frameborder='0' scrolling='no'></iframe>";
        resetPhotoUpload({startListening:true});        
        showPhotoUpload();
        mmt.showPreview();
        $("#momentImageUploadBtn").hide();
      });      
      $("#momentImageUploadCancel").click(function() {
        hidePhotoUpload();
        resetPhotoUpload();
      });
      $("#soundOff_action .momentRemovePhoto").click(function() {
        removePhoto();
        $("#photoPreview").hide();
        $("#soundOff_removePhoto").hide();
        $("#photoUploadLayer").show();
      });      
      $("#photoReset").show();
      $("#momentImageUploadBtn").click(function() {
        startPhotoPost();
      });
    });  
  };

  var startPhotoPost = function() {    
    var photoId = "Moment photo " + new Date().toLocaleDateString() + " " + new Date().toLocaleTimeString();
    var msg = '{action:"add",photoId:"' + photoId + '",token:"' + user.token + '"}';      
    var targetFrame = document.getElementById('uploadBtnRemote');    
    U.log("upload: Setting up photo upload... [" + msg + "]");
    targetFrame.contentWindow.location = "/somycity/upload_photo/#" + msg; // all browsers
    targetFrame.contentWindow.focus();
//  targetFrame.contentWindow.postMessage(msg, nbc.fullDomain); // IE8 and FF only
    
    //show preview image
    
    $("#soundOff_action .soundOff_attachLink").hide("fast");
    $("#photoPreview").show();
    $("#soundOff_removePhoto").show();
    $("#photoUploadLayer").hide();
    

    // reset temp variables
    retryCount = 0; 
    retryPreviewCount = 0;
    found = false;
    photoInserted = false;
    $("#photoLoading").show();
    
    // lookupPhoto(photoId); 
    lookupPhotoInUserUpdates(photoId);
  };
  
  var showPhotoUpload = function() {
    $('#photoUploadLayer').fadeIn();
  };
  
  var hidePhotoUpload = function() {
    $('#photoUploadLayer').fadeOut();
    $('#momentImageUploadBtn').hide();
  };  

  var stopListening = function() {
  };
  
  var resetPhotoUpload = function(config) {
    U.log("Resetting photo upload...");
    U.eraseCookie("mmt_upload"); 
    stopRequested = true; // stop listening for user action
    if (config && config.startListening) {
      stopRequested = false;        
      waitForUploadRequest();
    }
    $("#uploadBtnRemote")[0].src = "/somycity/upload_photo/"; 
    $("#photoLoading").hide();
    $("#imagePreview").attr({src: nbc.mediaDomain + "/designimages/grey_space.gif"});
    $("#momentPhotoPayloadPreview").attr({src: nbc.mediaDomain + "/designimages/grey_space.gif"});
    $("#momentPhotoPayload").val("");
    $("#momentImageUploadBtn").hide();
    $("#photoUploadLayer").show();    
  };
  
  var lookupPhoto = function(name) {
    U.log("Looking for [" + name + "]...");
    if (!found) {
      var queryString = "action=getProfile&uid=" + user.userId + "&token=" + user.token + "&r=" + Math.random();
      jQuery.getJSON("/i/dispatcher/?h=user&comments=n", queryString, function(data) {
        if (typeof data.profile !== 'undefined' && data.profile.status == 1) {
          var profPhotos = data.profile.UserProfile.photos;
          if (typeof profPhotos === "undefined" || profPhotos.length < 1) {
            U.log("Photos array empty.");
          }
          else {
            U.log("   First photo is [" + profPhotos[0].name + "]...");
            if (profPhotos[0].name.indexOf(name) >= 0) {
              found = true;
              photoFound(profPhotos[0]);
            }
          }
        }
        else if (typeof data.profile !== "undefined" && data.profile.status == -1) {
          U.log("moment_util: WARNING: error returned: " + data.profile.error);
        }
      });
    }
    
    if (!found && retryCount < retryMax) {
      U.log("   Did not find [" + name + "]. Retrying...");
      setTimeout(function() {
        lookupPhoto(name);
      }, 7500);
      retryCount++;
    }              
    else if (!found && retryCount >= retryMax) {
      photoNotFound();
    }
  };

  var lookupPhotoInUserUpdates = function(name) {
    U.log("Looking for [" + name + "]...");
    if (!found) {
//      var queryString = "action=getMostRecentUpdate&uid=" + user.userId + "&r=" + Math.random();
      var queryString = "action=lookupRecentMedia&uid=" + user.userId + "&title=" + name + "&mediaType=photo&t=" + user.token + "&r=" + Math.random();
      jQuery.getJSON("/i/dispatcher/?h=user", queryString, function(data) {
        if (typeof data.status !== "undefined" &&  data.status == 1) {
          U.log("Photo found!");
          found = true;
          photoFound(data);
        }
        else if (data.error) {
          U.log("moment_util: [WARNING] " + data.error);
        }
      });
    }
    
    if (!found && retryCount < retryMax) {
      U.log("   Did not find [" + name + "]. Retrying...");
      setTimeout(function() {
        lookupPhotoInUserUpdates(name);
      }, 7000);
      retryCount++;
    }              
    else if (!found && retryCount >= retryMax) {
      photoNotFound();
    }
  };
  
  var removePhoto = function() {
    $("#imagePreview").attr({src: ''});      
    $("#momentPhotoPayloadPreview").attr({src: ''});                
    $("#momentPhotoPayload").val('');
    stopRequested = true;
  };
  
  var photoFound = function(photo) {
    if (!photoInserted) {
      // Insert preloaded image after it finishes loading
      $('<img />')
        .attr('src', PHOTO_BASE + photo.pathToMedia)
        .load(function(){
          $("#imagePreview").attr({src: PHOTO_BASE + photo.pathToMedia});      
          $("#momentPhotoPayloadPreview").attr({src: PHOTO_BASE + photo.pathToMedia});            

          photoInserted = true;
          $("#photoLoading").hide();
          var payload = '                                                                                                                        ' +
            '[DO NOT EDIT - CUSTOM_CODE [PHOTO - urlStart[' +  PHOTO_BASE + photo.pathToMedia + ']urlEnd PHOTO_END] CUSTOM_CODE_END]';
          $("#momentPhotoPayload").val(payload);  
          U.log("Photo payload: " + $("#momentPhotoPayload").val());
      });
      
      if (!photoInserted && retryPreviewCount < 10) {
        U.log("Having trouble loading [" + PHOTO_BASE + photo.pathToMedia + "]... retry #" + retryPreviewCount);
        // let's check in a few secs
        setTimeout(function() {
          if (!photo.pathToMediaOrig) {
            photo.pathToMediaOrig = photo.pathToMedia;
          }
          photo.pathToMedia = photo.pathToMediaOrig + "?r=" + Math.random();
          photoFound(photo);
        }, 5000);
        retryPreviewCount++;
      }
      
      if (retryPreviewCount == 10) {
        photoNotFound();
        throw new Error("Image upload failed.");
      }
    }
  };

  var photoNotFound = function() {
    $("#photoLoading").hide();
    $("#imagePreview").attr({src: nbc.mediaDomain + "/designimages/txt_moment_error_photo.gif"});
  };
  
  var waitForUploadRequest = function() {
    U.log("... waiting ... ")
    if (U.readCookie("mmt_upload") == "yes") {
      startPhotoPost();
      U.eraseCookie("mmt_upload");
    }
    else {
      if (!stopRequested) {
        setTimeout(function() {
          waitForUploadRequest();
        }, 500);      
      }
    }
  }

  /* PUBLIC METHODS */
  return {
    initImageUpload: initImageUpload,
    startPhotoPost: startPhotoPost,
    showPhotoUpload: showPhotoUpload,
    resetPhotoUpload: resetPhotoUpload,
    removePhoto: removePhoto
  }; 
}();

/** 
 * NBC_MomentUploadUtil
 * 
 * Moment Upload Util
 * On request, submits the image form to kickapps.
 */
var NBC_MomentUploadUtil = function() {
  
  var initReceiver = function() {
    if (window.attachEvent) {
      window.attachEvent("onfocus", checkMsg); // IE      
    } 
    else { 
      window.addEventListener("focus", checkMsg, false);             
    }
  };
  
  function checkMsg() {    
//    var IE6 = (navigator.userAgent.toLowerCase().indexOf('msie 6') != -1) && (navigator.userAgent.toLowerCase().indexOf('msie 7') == -1)    
    var msg = window.location.hash.substring(1);
    if (msg != "") {
      window.location.hash = "";
      clearInterval(NBC_MomentUploadUtil.intervalId);
      U.log("upload: Received go-ahed to submit photo form [" + msg + "]");
      receiver(msg);
    }
  
    if (NBC_MomentUploadUtil.intervalId === 0) {
      NBC_MomentUploadUtil.intervalId = setInterval(checkMsg, 500);
    }
  }

  // The input to the receiver function is the message.
  function receiver(data) {    
    if (typeof data !== 'undefined') { //  && e.origin === nbc.fullDomain) {
      // Assign values to spans for display within the frame.
      var data = eval("(" + unescape(data) + ")");
      if (typeof data.action === "undefined") {
        throw new Error("Illegal request. Action has to be specified.");
      }
      if (data.action === "add") {
        U.log("Adding photo with id [" + data.photoId + "]."); 
        $("#photoName").val(data.photoId);
        $("#t").val(data.token);
        var fileName = $('input[name="media"]').val();
        U.log("Uploading local file name [" + fileName + "]");
        if (fileName !== "") {
          submitUploadForm();    
        }
        else {
          U.log("File not selected. No action taken.");
        }
      }
      else if (data.action === "init") {
        U.log("upload: init msg received... waiting for add msg");
      }
      else if (data.action === "reset") {
        U.log("Resetting form.");
        $("#photoUpload")[0].reset();
      }
      else {
        throw new Error("Action [" + data.action + "] not supported.");
      }
    }
  }

  function submitUploadForm() {
    U.log("upload: Submitting photo form.");
    $("#photoUpload").submit();
  }  
  
  // validate the photo field is jpg, png or gif only
  function validateFileExtension(fld) {
    if(!/(\.png|\.gif|\.jpg|\.jpeg)$/i.test(fld.value)) {
      parent.document.getElementById("imageExtensionsOnly").style.color='red';
      parent.document.getElementById("momentImageUploadBtn").style.display='none';
      fld.form.reset();
      fld.focus();
      return false;
    }
    else {
      parent.document.getElementById("imageExtensionsOnly").style.color='#999999';
      parent.document.getElementById("momentImageUploadBtn").style.display='block';
    }
    return true;
  }

  // check to see if user selected a file
  function checkUpload() {
    if (!this.browseField) {
      this.browseField = document.getElementById("uploadPhotoBrowse");
    }
    if (this.browseField.value == "") {
      setTimeout(function() {
        checkUpload();
      }, 500);
    }
    else {
      if (validateFileExtension(this.browseField)) {
        U.createCookie("mmt_upload", "yes");
      }
    }
  }  
  
  return {
    init: initReceiver,
    validate: validateFileExtension,
    check: checkUpload
  };
}();  
NBC_MomentUploadUtil.intervalId = 0;

var NBC_MomentAggregate = function() {
  
  var init = function() {    
    $(document).ready(function() {
      if (typeof mainAggArr === "object" && mainAggArr.length === 15) {
        $('a.moment_more').click(function() {
          document.location = "/somycity/?page=" + nbc.moment.incrementPage() +
              "&sortType=" + nbc.moment.sortType + "&categories=" + nbc.moment.category;
          return false;
        }).show();        
      }
    
      /* onclick for MORE>> */  
/*      
      $('a.moment_more').click(function(event) {
//        var url = '/i/dispatcher/?h=moment&action=more&page='+nbc.moment.incrementPage()+
//            '&sortType='+nbc.moment.sortType+'&categories='+nbc.moment.category;
        var queryString = 'action=more&page='+nbc.moment.incrementPage()+
          '&sortType='+nbc.moment.sortType+'&categories='+nbc.moment.category; 
        U.log("making request...");
        jQuery.getJSON("/i/dispatcher/?h=moment", queryString, function(data) {
          U.log("json returned:" + data.data);
        });         
*/ 
        /*
        $.ajax({
          type: "GET",
          url: url,
          dataType: "html",
          success: function(data) {
            $("#momentList").append("<p>new data</p>");
          }
        });
        
      });
      */      
    });
  };

  // public methods
  return {
    init: init
  };
}();  
