function Video(fid, uid, fileName, fileSize, width, height, createDate, mode, title, description, category, featured, vcode, duration, originalFilename, disk, url, flagged, thumbnailNo, ugid, uploadStatus, viewCount, viewCount24, viewCount168, lastViewDate, lastViewIp, ratingCount, ratingSum, ratingAvg, ratingCount24, ratingSum24, ratingAvg24, ratingCount168, ratingSum168, ratingAvg168, lastVoteDate, lastVoteIp, commentCount, commentCount24, commentCount168, favouritedCount, flagCount, countersLastUpdated, tags, comments, userName, categoryName, ugName, chid, chName, own, playUrl, categoryUrl, userUrl, usergroupUrl, stillUrls) {
  var me = this;
  me.fid = fid;
  me.fid = fid;
  me.uid = uid;
  me.fileName = fileName;
  me.fileSize = fileSize;
  me.width = width;
  me.height = height;
  me.createDate = new Date();
  me.createDate.setTime(createDate * 1000);
  me.mode = mode;
  me.title = title;
  me.description = description;
  me.category = category;
  me.featured = featured;
  me.vcode = vcode;
  me.duration = duration;
  me.originalFilename = originalFilename;
  me.disk = disk;
  me.url = url;
  me.flagged = flagged;
  me.thumbnailNo = thumbnailNo;
  me.ugid = ugid;
  me.uploadStatus = uploadStatus;
  me.viewCount = viewCount;
  me.viewCount24 = viewCount24;
  me.viewCount168 = viewCount168;
  me.lastViewDate = new Date();
  me.lastViewDate.setTime(lastViewDate * 1000);
  me.lastViewIp = lastViewIp;
  me.ratingCount = ratingCount;
  me.ratingSum = ratingSum;
  me.ratingAvg = ratingAvg;
  me.ratingCount24 = ratingCount24;
  me.ratingSum24 = ratingSum24;
  me.ratingAvg24 = ratingAvg24;
  me.ratingCount168 = ratingCount168;
  me.ratingSum168 = ratingSum168;
  me.ratingAvg168 = ratingAvg168;
  me.lastVoteDate = new Date();
  me.lastVoteDate.setTime(lastVoteDate * 1000);
  me.lastVoteIp = lastVoteIp;
  me.commentCount = commentCount;
  me.commentCount24 = commentCount24;
  me.commentCount168 = commentCount168;
  me.favouritedCount = favouritedCount;
  me.flagCount = flagCount;
  me.countersLastUpdated = new Date();
  me.countersLastUpdated.setTime(countersLastUpdated * 1000);
  me.tags = tags;
  me.comments = comments;
  me.userName = userName;
  me.categoryName = categoryName;
  me.ugName = ugName;
  me.chid = chid;
  me.chName = chName;
  me.own = own;
  me.playUrl = playUrl;
  me.categoryUrl = categoryUrl;
  me.userUrl = userUrl;
  me.usergroupUrl = usergroupUrl;
  me.stillUrls = stillUrls;

  me.getPlayUrl = function() {
    return me.playUrl;
  }

  me.getDefaultThumbnailUrl = function() {
    return me.stillUrls[me.thumbnailNo - 1];
  }

  me.getThumbnailUrl = function(i) {
    return me.stillUrls[i - 1];
  }

  me.getStarsCount = function(interval) {
    var avg = 0;
    if (interval == 0) avg = ratingAvg;
    if (interval == 1) avg = ratingAvg24;
    if (interval == 2) avg = ratingAvg168;
    r = Math.round(avg*2) / 2;

    var avgStr = '0';
    if(r == 0.5) {
       avgStr = '05';
    } else {
      if(r != Math.round(r)) avgStr = 10*r;
      else avgStr = r;
    }
    return avgStr;
  }

  me.getStarsUrl = function(interval) {
    return 'images/rate/sfff' + me.getStarsCount(interval) + '.gif';
  }

  me.getCategoryUrl = function() {
    return me.categoryUrl;
  }

  me.getUserUrl = function() {
    return me.userUrl;
  }

  me.getUserName = function() {
    return userName;
  }

  me.getUploaderUrl = function() {
    //if (me.ugid == 1) return me.userUrl;
    //else return me.usergroupUrl; 
    return me.userUrl;
  }

  me.getUploaderName = function() {
    //if (me.ugid == 1) return userName;
    //else return ugName;
    return me.userName;
  }

  me.getFormattedDuration = function() {
    var h = Math.floor(me.duration / 3600);
    var d = me.duration % 3600;
    var m = Math.floor(d / 60);
    var s = d % 60;
    var durationstring = '';
    if(h > 0) {
      if(h < 10) durationstring += '0';
      durationstring += h + ':';
    }
    if(m < 10) durationstring += '0';
    durationstring += m + ':';
    if(s < 10) durationstring += '0';
    durationstring += s;
    return durationstring;
  }

  me.getFormattedDate = function() {
    var year = me.createDate.getYear();
    if(year < 1900) year += 1900;
    var month = me.createDate.getMonth() + 1;
    var day = me.createDate.getDate();
    var datestring = '' + year + '.';
    if(month < 10) datestring += '0';
    datestring += month + '.';
    if(day < 10) datestring += '0';
    datestring += day;
    datestring += '.';
    return datestring;
  }

  me.getFormattedViews = function(interval) {
    var number = 0;
    if (interval == 0) number = me.viewCount;
    if (interval == 1) number = me.viewCount24;
    if (interval == 2) number = me.viewCount168;
    var s = new String(number);
    var r = "";
    var c = 0;
    for (var i = s.length - 1; i >= 0; i--) {
      r = s.charAt(i) + r;
      c++;
      if (i != 0 && c != 0 && c % 3 == 0) r = " " + r;
    }
    return r;
  }

  me.getRoundedAvg = function(interval) {
    var avg = 0;
    if (interval == 0) avg = me.ratingAvg;
    if (interval == 1) avg = me.ratingAvg24;
    if (interval == 2) avg = me.ratingAvg168;
    return Math.round(100 * avg) / 100;
  }

  me.getRatingCount = function(interval) {
    if (interval == 0) return me.ratingCount;
    if (interval == 1) return me.ratingCount24;
    if (interval == 2) return me.ratingCount168;
  }

  me.getShortDescription = function(length) {
    if (length == undefined) length = 150;
    if (me.description.length <= length) return me.description;
    return me.description.substr(0, length - 4) + '... ';
  }

  me.getFullDescription = function() {
    return me.description;
  }

  me.getShortTagsArray = function(length) {
    if (length == undefined) length = 105;
    var tagsStringLength = 0;
    for (var i=0; i<me.tags.length; i++) {
      tagsStringLength += me.tags[i].tag.length;
      if (i != 0) tagsStringLength += 2;
      if (tagsStringLength > length) return me.tags.slice(0, i);
    }
    return me.tags;
  }

  me.getFullTagsArray = function() {
    return me.tags;
  }

  me.getTagUrl = function(i) {
    return me.tags[i].tagUrl;
  }
}

function User(uid, createDate, dispName, weburl, blogurl, videoCount, videoCount168, viewCount, viewCount168, ratingCount, ratingSum, ratingAvg, ratingCount168, ratingSum168, ratingAvg168, commentCount, commentedCount, favouritedCount, videosFavouritedCount, flaggedCount, thumbnailUrl, userUrl) {
  var me = this;
  me.uid = uid;
  me.createDate = new Date();
  me.createDate.setTime(createDate * 1000);
  me.dispName = dispName;
  me.weburl = weburl;
  me.blogurl = blogurl;
  me.videoCount = videoCount;
  me.videoCount168 = videoCount168;
  me.viewCount = viewCount;
  me.viewCount168 = viewCount168;
  me.ratingCount = ratingCount;
  me.ratingSum = ratingSum;
  me.ratingAvg = ratingAvg;
  me.ratingCount168 = ratingCount168;
  me.ratingSum168 = ratingSum168;
  me.ratingAvg168 = ratingAvg168;
  me.commentCount = commentCount;
  me.commentedCount = commentedCount;
  me.favouritedCount = favouritedCount;
  me.videosFavouritedCount = videosFavouritedCount;
  me.flaggedCount = flaggedCount;
  me.thumbnailUrl = thumbnailUrl;
  me.userUrl = userUrl;

  me.formatNumber = function(number) {
    var s = new String(number);
    var r = "";
    var c = 0;
    for (var i = s.length - 1; i >= 0; i--) {
      r = s.charAt(i) + r;
      c++;
      if (i != 0 && c != 0 && c % 3 == 0) r = " " + r;
    }
    return r;
  }

  me.getDispName = function() {
    return me.dispName;
  }

  me.getUserLink = function() {
    return me.userUrl;
  }

  me.getVideoCount = function() {
    return me.videoCount;
  }

  me.getViewCount = function() {
    return me.viewCount;
  }

  me.getFlaggedCount = function() {
    return me.flaggedCount;
  }

  me.getRoundedAvg = function(interval) {
    if (interval == 1) return Math.round(100 * me.ratingAvg168) / 100;
    return Math.round(100 * me.ratingAvg) / 100;
  }

  me.getStarsCount = function(interval) {
    if (interval == 1) return me.formatNumber(me.ratingAvg168);
    return Math.round(me.ratingAvg);
  }

  me.getRatingAvg = function() {
    return me.ratingAvg;
  }

  me.getRatingCount = function() {
    return me.ratingCount;
  }

  me.getCommentCount = function() {
    return me.commentCount;
  }

  me.getThumbnailUrl = function() {
    return me.thumbnailUrl;
  }

  me.getFormattedVideoCount = function(interval) {
    if (interval == 1) return me.formatNumber(me.videoCount168);
    return me.formatNumber(me.videoCount);
  }

  me.getFormattedViewCount = function(interval) {
    if (interval == 1) return me.formatNumber(me.viewCount168);
    return me.formatNumber(me.viewCount);
  }

  me.getFormattedRatingCount = function(interval) {
    if (interval == 1) return me.formatNumber(me.ratingCount168);
    return me.formatNumber(me.ratingCount);
  }

  me.getFormattedCommentCount = function() {
    return me.formatNumber(me.commentCount);
  }

  me.getFormattedCommentedCount = function() {
    return me.formatNumber(me.commentedCount);
  }

  me.getFormattedFavouritedCount = function() {
    return me.formatNumber(me.favouritedCount);
  }

  me.getFormattedVideosFavouritedCount = function() {
    return me.formatNumber(me.videosFavouritedCount);
  }

  me.getFormattedFlaggedCount = function() {
    return me.formatNumber(me.flaggedCount);
  }

}

function Comment(createDate, dispName, uid, comment, userUrl) {
  var me = this;
  me.createDate = new Date();
  me.createDate.setTime(createDate * 1000);
  me.dispName = dispName;
  me.uid = uid;
  me.comment = comment;
  me.userUrl = userUrl;

  me.getUserUrl = function() {
    return me.userUrl;
  }

  me.getDispName = function() {
    return me.dispName;
  }

  me.getFormattedDateAndTime = function() {
    var year = me.createDate.getYear();
    if(year < 1900) year += 1900;
    var month = me.createDate.getMonth() + 1;
    var day = me.createDate.getDate();
    var datestring = '' + year + '.';
    if(month < 10) datestring += '0';
    datestring += month + '.';
    if(day < 10) datestring += '0';
    datestring += day;
    datestring += '. ';
    var hours = me.createDate.getHours();
    if(hours < 10) datestring += '0';
    datestring += hours + ':';
    var minutes = me.createDate.getMinutes();
    if(minutes < 10) datestring += '0';
    datestring += minutes;
    var seconds = me.createDate.getSeconds();
    return datestring;
  }

  me.getCommentText = function() {
    return me.comment;
  }
}
