function log(message) {
  if (typeof(console) != 'undefined') {
    console.log(message);
  }
}

function showLoader() {
  $('fadeDiv').show();
}

function hideLoader() {
  $('fadeDiv').hide();
}

var slotHolderName = 'theMainSlot';
var slotClassName = 'slot';
var colHeaderName = "colHeader";
var sortFunction = sortOn;
var anchoredRow = null;
var slotsToBeSorted = [];

function setupSort(otherSortParams) {
  var anchorFirstRow = false;
  if (otherSortParams) {
    slotHolderName = otherSortParams['slotHolderName'] || slotHolderName;
    slotClassName = otherSortParams['slotClassName'] || slotClassName;
    colHeaderName = otherSortParams['colHeaderName'] || colHeaderName;
    sortFunction = otherSortParams['sortFunction'] || sortFunction;
    anchorFirstRow = otherSortParams['anchorFirstRow'] || anchorFirstRow;
  }
  var topslot = $('topcontent');
  var sortColumns = $H(sortSpec).keys();
  for (var col = 0; col < sortColumns.length; col++) {
	  var sortColumn = topslot.down("." + sortColumns[col]);
    var sortField = $(sortSpec)[sortColumns[col]]['sortField'].deCamelize();
	  title = 'Sort By ' + sortField;
    var sortIcon = Builder.node('img', {src:'http://fp.profiles.us.playstation.com/playstation/img/transsort.gif', alt:title, width:'16',height:'10', className:'sortIcon'});
	  
	  if (sortColumn.down(".columntext")) {
	    sortColumn.down(".columntext").insert({'bottom':sortIcon});
	  }
	  else {
	    sortColumn.insert({'bottom':sortIcon});
	  }
    sortColumn.observe("click", doSort);
	  sortColumn.addClassName("sortPointer");
	  sortField = sortField.charAt(0).toUpperCase() + sortField.substring(1, sortField.length);	  
	  sortColumn.writeAttribute('title', title);
	  if ($(sortSpec)[sortColumns[col]].defaultSort) {
	    sortColumn.addClassName($(sortSpec)[sortColumns[col]].defaultSort);
	  }
  }
  updateRowsTobeSorted(anchorFirstRow);
}

function updateRowsTobeSorted(anchorFirstRow) {
  var allSlots = $$('.'+slotClassName);
  for (var i = 0; i < allSlots.length; i++) {
    if (allSlots[i].nodeType == 1) { 
      if (i == 0 && anchorFirstRow) {
        anchoredRow = allSlots[i];
      } else {
        slotsToBeSorted.push(allSlots[i]);
      }
    }
  }
}

function doSort(evt) {
  if (monitor.isBusy()) {
    return;
  } else {
    monitor.incJob();
  }
  var tgt = Event.element(evt);
  tgt = tgt.hasClassName(colHeaderName) ? tgt : tgt.up("."+colHeaderName);
  var sortBy = "";
  var isAscSort = true;
  var sortColumns = $H(sortSpec).keys();
  for (var col = 0; col < sortColumns.length; col++) {
    if (tgt.hasClassName(sortColumns[col])) {
      if (tgt.hasClassName("asc")) {
        tgt.removeClassName("asc");
        tgt.addClassName("desc");
        isAscSort = false
      } else if (tgt.hasClassName("desc")) {
        tgt.removeClassName("desc");
        tgt.addClassName("asc");
      } else {
        $$("."+colHeaderName).each(function(elem) {
          elem.removeClassName("asc").removeClassName("desc");
        });
        tgt.addClassName("asc");
      }
      sortFunction(sortColumns[col], isAscSort);
      break;
    }
  }
  monitor.decJob();
}

function textContentExtractor(slot, sortField) {
  return slot.down(sortField).innerHTML.strip();
}

function onlineStatusExtractor(slot, sortField) {
  var friendStatus= slot.down('.onlineStatus').className.match("friendStatus[0-9]").toString().slice(-1);
  if (friendStatus == 1) { // we are friend.
    if (slot.down('.oStatus').down(".away")) {
      return 1; //online but away
    } else if (slot.down('.oStatus').down(".online")) {
      return 0; //online
    }
    return -1; //offline
  }
  return friendStatus;
}

function sortOn(sortCol, isAscSort) {
  showLoader();
  var sortField = "." + sortSpec[sortCol]['sortField'] + "SortField";
  slotsToBeSorted.sort( function(slot1, slot2) {
    if (slot1.down(sortField) && slot2.down(sortField)) {
      var field1 = sortSpec[sortCol]['extractor'](slot1, sortField);
      var field2 = sortSpec[sortCol]['extractor'](slot2, sortField);
      return sortSpec[sortCol]['comparator'](field1, field2);
    } else {
      return slot1.down(sortField) ? 1 : -1;
    }
  });

  var slotHolder = $(slotHolderName);
  for (var i = 0; i < slotsToBeSorted.length; ++i) {
    if (isAscSort == true) {
      slotHolder.insert( {'bottom' : slotsToBeSorted[i]});
    } else {
      slotHolder.insert( {'top' : slotsToBeSorted[i]});
    }
  }

  if (isAscSort == false && anchoredRow) {
    slotHolder.insert( {'top' : anchoredRow});
  }
  
  var isIE6 = /msie|MSIE 6/.test(navigator.userAgent);
  if (isIE6) {
    correctPNG();
  }
  hideLoader();
}
var trophyVal = {'HIDDEN':0, 'BRONZE':1, 'SILVER':2, 'GOLD':3, 'PLATINUM':4};
function extractIntFromPercentAndDash(f) {
  if (!f || f == '%' || f == '-') {
    return -1;
  }
  if (f[f.length-1] == '%') {
    return f = f.truncate(f.length-1, '');
  }
  return f;
}
function percentAndDashCompare(f1, f2) {
  return integerCompare(extractIntFromPercentAndDash(f1), extractIntFromPercentAndDash(f2));
}
function integerCompare(f1, f2) {
  return f1 - f2;
}
function dateCompare(f1, f2) {
  f1 = Date.parse(f1);
  f2 = Date.parse(f2);
  return f1 == f2 ? 0 : (f1 > f2 ? 1 : -1);
}
function stringCompare(f1, f2) {
  f1 = f1.toUpperCase();
  f2 = f2.toUpperCase();
  return f1 == f2 ? 0 : (f1 > f2 ? 1 : -1);
}
function trophyCompare(f1, f2) {
  f1 = trophyVal[f1];
  f2 = trophyVal[f2];
  return f1 == f2 ? 0 : (f1 > f2 ? 1 : -1);
}
function onlineStatusCompare(f1, f2) {
  return integerCompare(f1, f2);
}

function reportError(request) {
  log("Error: no data");
}

function redirectToBusy() {
  window.location = busyPath;
}

function redirectToLogin(transport) {
  var loginPath = transport.responseJSON.loginPath;
  window.location = loginPath;
}

function resizeFadeDiv() {
   var fadeDiv = document.getElementById("fadeDiv");
   //check dimensions of window
   var w = 0;
   var h = 0;
   //ff
   if (window.innerWidth) {
	  //alert("1a");
      w = window.innerWidth;
      h = window.innerHeight;
   }
   //ie6
   else if (document.documentElement && document.documentElement.clientWidth && document.documentElement.clientHeight) {
	  //alert("1b");
      w = document.documentElement.clientWidth;
      h = document.documentElement.clientHeight;
   }
   //ie6 quirks
   else if (document.body && document.body.clientWidth && document.body.clientHeight) {
	  //alert("1c");
      w = document.body.clientWidth;
      h = document.body.clientHeight;
   }
   else {
      w = 0;
      h = 0;
   }
   //now check dimensions of document to see which is larger
   var w2 = 0;
   var h2 = 0;
   //ie6
    if (document.body && document.body.scrollWidth && document.body.scrollHeight) {
	  //alert("2a");
      w2 = document.body.scrollWidth;
      h2 = document.body.scrollHeight;
   }
   else if (document.documentElement && document.documentElement.scrollWidth && document.documentElement.scrollHeight) {
	  //alert("2b");
      w2 = document.documentElement.scrollWidth;
      h2 = document.documentElement.scrollHeight;
   }
   //ff
   else if (document.body && document.body.clientWidth && document.body.clientHeight) {
	  //alert("2c");
      w2 = document.body.clientWidth;
      h2 = document.body.clientHeight;
   }
   else {
      w2 = 0;
      h2 = 0;
   }
   //alert(h + ":" + h2)
   fadeDiv.style.height = ((h > h2) ? h : h2) + "px";
   fadeDiv.style.width = ((w > w2) ? w : w2) + "px";
}


//window.onresize = resizeFadeDiv;

function setupScroll() {
  if ($('theMainSlot') == null) {
    return;
  }
	$('scrollbar_track').style.height="446px";
	$('scrollbar_up_arrow').style.height="13px";
	$('scrollbar_down_arrow').style.height="13px";
	var scrollbar = new Control.ScrollBar ('theMainSlot','scrollbar_track');

	if ($('scrollbar_track').visible()) {
		$('scrollbar_up_arrow').show();
		$('scrollbar_down_arrow').show();
		$('scrollbar_up_arrow').observe('click',function(event){  
		     scrollbar.scrollBy(-60);  
		     event.stop();  
		 });  	   
		$('scrollbar_down_arrow').observe('click',function(event){  
		     scrollbar.scrollBy(60);  
		     event.stop();  
		 });
	}
	else {
		$('scrollbar_up_arrow').hide();
		$('scrollbar_down_arrow').hide();
	}
}

document.observe("dom:loaded", function() {
  /* This is used to tell, everytime an AJAX function is created and completed, the following will get executed. */
  
  //resizeFadeDiv();

  Ajax.Responders.register({
    onCreate: function() {
    monitor.incJob();
  },
  onLoading: function() {
  		if(Ajax.activeRequestCount>0) {
		    //showLoader();
  		}
  	},
  	onComplete: function() {	
      monitor.decJob();
  		isIE6 = /msie|MSIE 6/.test(navigator.userAgent);
  		if (isIE6) {
  			correctPNG();
  		}
  		if (Ajax.activeRequestCount < 1) {
  		    //hideLoader();
  			//resizeFadeDiv();
  			setupScroll();
			//Effect.Appear ("playstationNetwork", {duration:0.1});
  		}
  	}
  });

});

function showHiddenSlots() {
  $$('.slot').each( function(elem) { 
    if (!elem.visible()) { 
      elem.show(); 
    } 
  });
}

String.prototype.deCamelize = function()
{
  return this.replace(/([a-z])([A-Z])/g,'$1 $2');
}

function thisOrUp(element, className) {
  if ($(element).hasClassName(className)) {
    return element;
  } else {
    return element.up("." + className);
  }
}

var eventMonitor = Class.create({
  initialize: function() {
    this.busyCount = 0;
  },
  incJob: function() {
    this.busyCount++;
  },
  decJob: function() {
    this.busyCount--;
  },
  isBusy: function() {
    this.busyCount == 0 ? false : true;
  }
});
var monitor = new eventMonitor();
