/**
 * jQuery fontscale - A plugin to alter the font size of DOM elements 
 * Copyright (c) 2010 Ben Byrne - ben(at)fireflypartners(dot)com | http://www.fireflypartners.com
 * Dual licensed under MIT and GPL.
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 * Date: 07/21/2010
 * @author Ben Byrne
 * @version 0.2
 * @modify by Keio Kwan - Drug and Alcohol Office - Government of Western Australia
 */

/**
 * For complete documentation, visit http://byrnecreative.com/blog/fontscale
 * @example $("#fontgrow").fontscale("p","+");
 * @desc Bind scaling up the font size of all P elements to the element #fontgrow with default settings.
 * @example $("#fontshrink").fontscale("p","-",{unit:"percent",increment:25,useCookie:false,adjustLeading:true});
 * @desc Bind scaling down the font size of all P elements to the element #fontshrink with custom settings.
 * @example $("#reset").fontscale("p","reset");
 * @desc Eliminate all fontscale resizing 
 * @only useCookie can setup maxCount of increase and decrease of font size - modified
 */
 
(function($) {
  $.fn.fontscale = function(selectors, adjustment, parameters) {

    var settings = $.extend( $.fn.fontscale.defaults, parameters);
    
    //only use cookies if we can
		if ( ! $.isFunction( $.cookie )  ) settings.useCookie = false;
		
    // if the cookie exists, we're supposed to use it, and we haven't before, then load it 
	  if (!settings.cookieLoaded && $.cookie(settings.cookieName)  && settings.useCookie) {
      cookieSettings = $.fn.fontscale.readcookie( settings.cookieName );
	    //only actually apply the data from the cookie if its unit settings match!
			if (cookieSettings.unit == settings.unit && !settings.cookieLoaded) {
				settings.currentCount = cookieSettings.currentcount;
				/*var adj = '';
				if (settings.currentCount == 0){adj = "reset";}
				else if (settings.currentCount > 0){adj = "up";}
				else if (settings.currentCount < 0){adj = "down";}
				alert(cookieSettings.delta);*/
				$.fn.fontscale.scale( selectors, cookieSettings.delta, settings, true );
				//alert("read");
			}
	  }
		
    this.each( function() {

		// bind to elements
		$(this).bind(settings.event, function(e) {
			  $.fn.fontscale.scale( selectors, adjustment, settings, false);
			  if ($.isFunction(settings.onAfter)) settings.onAfter(selectors, adjustment, settings); //is this okay?	
			  e.preventDefault();
			  		
		});
	});
		
	return this;
		
  };
  
  // customize for list menu link
  $.fn.fontscale.updateLinkHeight = function(){
	  var $listLink = $('ul.home_ListMenu > li > a');
	  var linkmaxHeight = 0;
	  $listLink.css('min-height','26px');
	  $listLink.each(function(){
		  var $alink = $(this);
		  
		  if (parseInt($alink.height()) > linkmaxHeight)
		  {
			  linkmaxHeight = parseInt($alink.height());
		  }
	  });
	  
	  $listLink.css('min-height',linkmaxHeight + 'px');
  }
  
  $.fn.fontscale.reset = function( object, settings ) {
    
    //remove any scaling done inline (assumed to be from this plugin)
    /*$(object).each(function(i) {
	  var $curTd = $('td', $(this));
	  var $curHeader = $('h4', $curTd);

      $(this).css('font-size','');
	  $curTd.css('font-size','');
	  $curHeader.css('font-size','');
	  //reset line-height whatever is adjusted or not
	  $(this).css('line-height','');
	  $curTd.css('line-height','');
	  $curHeader.css('line-height','');
      //if (settings.adjustLeading) $(this).css('line-height','');
    });*/
    $(object).each(function(i) {
		  
		var $self = $(this);
		
		$self.css("font-size", '');
		$self.css("line-height", '');
		
		/*var $allChild = $(':header', $(this));
		$allChild.each(function(){
			var $ele = $(this);
			
			$ele.css("font-size", '');
			$ele.css("line-height", '');
		});*/
	  
	});
	//$.fn.fontscale.updateLinkHeight();
	
    //if we're using a cookie, reset it too
    if ( settings.useCookie ) {
  		$.fn.fontscale.savecookie('delete', settings);
    }
  }

	$.fn.fontscale.scale = function( object, adj, settings, fromcookie) {
	
    //make delta an int that changes nothing to start
    var delta = 0;
	var curMode = "none";
	var curCount = 0;
	var maxCount = 0;
	minCount = parseInt(settings.minCount);
	maxCount = parseInt(settings.maxCount);
	curCount = parseInt(settings.currentCount);
	//maxCount = settings.maxCount;
	
    if (adj == "+" || adj == "up") {
      //set the delta as an increase
      delta = parseInt(settings.increment);
	  curMode = "up";
	  maxCount = parseInt(settings.maxCount);
    } else if (adj == "-" || adj == "down") {
      //set the delta as a decrease
      delta = parseInt(settings.increment) * -1;
	  curMode = "down";
	  minCount = parseInt(settings.minCount) * -1;
    } else if (adj == "reset") {
      //remove applied changes and do nothing else
	  curMode = "none";
	  settings.currentCount = 0;
      return $.fn.fontscale.reset( object, settings );
    } else if (fromcookie) {
		
	 
	  if (curCount > maxCount && curCount > 0){
		  settings.currentCount = maxCount;
		  }
	  if (curCount < minCount && curCount < 0){
		  settings.currentCount = minCount * -1;
	  }
	  delta = parseInt(settings.increment) *  settings.currentCount;

	  $.fn.fontscale.fontUpdate(object, settings, delta);
	  settings.cookieLoaded = true;
	 }	 
    //change the value into a percent if we have to
    if (settings.unit == "percent" && !fromcookie) {
      delta = 1 + (delta / 100);
    }
    	 
	if ((maxCount==0)&&(minCount==0)){
		 $.fn.fontscale.fontUpdate(object, settings, delta);
		 if (settings.useCookie && !fromcookie)  $.fn.fontscale.savecookie( delta, settings );
		 }
	else if(((curMode == "up")&&(curCount < maxCount))||((curMode == "down")&&(curCount > minCount)))
	{
		/*$(object).each(function(i) {
	
		  var currentSize = parseInt($(this).css("font-size"));
		  var currentLeading = parseInt($(this).css("line-height"));
		  var $curTd = $('td', $(this));
		  var $curHeader = $(':header', $curTd);
		  
		  if (settings.unit == "percent") {
			$(this).css("font-size", Math.round( currentSize * delta));
			$curTd.css("font-size", Math.round( currentSize * delta));
			$curHeader.css("font-size", Math.round( currentSize * delta));
			
			if (settings.adjustLeading) {
				$(this).css("line-height", Math.round( currentLeading * delta));
				$curTd.css("line-height", Math.round( currentLeading * delta));
				$curHeader.css("line-height", Math.round( currentLeading * delta));
			}
		  } else {
			  
			$(this).css("font-size", (currentSize + delta) + "px");
			$curTd.css("font-size", (currentSize + delta) + "px");
			$curHeader.css("font-size", (currentSize + delta) + "px");
			
			if (settings.adjustLeading){
				
				$(this).css("line-height", (currentLeading + delta) + "px");
				$curTd.css("line-height", (currentLeading + delta) + "px");
				$curHeader.css("line-height", (currentLeading + delta) + "px");
			}
		  }
	  
		 });*/
		 $.fn.fontscale.fontUpdate(object, settings, delta);
		 
		 if (curMode == "up")
		 	curCount = curCount + 1;
		 else if (curMode == "down")
			curCount = curCount - 1;
		settings.currentCount = parseInt(curCount);
  		if (settings.useCookie && !fromcookie)  $.fn.fontscale.savecookie( delta, settings );
	}
	
  //$.fn.fontscale.updateLinkHeight();
 
  return;
  
  };
  
  $.fn.fontscale.fontUpdate = function(object, settings, delta){
	  $(object).each(function(i) {
		  
		  var $self = $(this);
		  var selfSize = parseInt($self.css("font-size"));
		  var selfLeading = parseInt($self.css("line-height"));
		  if (settings.unit == "percent") {
			  $(this).css("font-size", Math.round( selfSize * delta));
			  if (settings.adjustLeading) {
				  $(this).css("line-height", Math.round( selfLeading * delta));
			  }
		  } else {
			
			  $(this).css("font-size", (selfSize + delta) + "px");
			  if (settings.adjustLeading){
				  
				  $(this).css("line-height", (selfLeading + delta) + "px");
			  }
		  }
		  /*fix for my own use*/
		  /*var $allChild = $(' > table > tr > td, > table > tbody > tr > td, > table > tr > th, > table > tbody > tr > th, > :header, td > :header, p > a.Anchor', $(this));
		  $allChild.each(function(){
			  var $ele = $(this);
			  var currentSize = parseInt($ele.css("font-size"));
			  var currentLeading = parseInt($ele.css("line-height"));
			  
			  if (settings.unit == "percent") {
				  $(this).css("font-size", Math.round( currentSize * delta));
				  if (settings.adjustLeading) {
					  $(this).css("line-height", Math.round( currentLeading * delta));
				  }
			  } else {
				
				  $(this).css("font-size", (currentSize + delta) + "px");
				  if (settings.adjustLeading){
					  
					  $(this).css("line-height", (currentLeading + delta) + "px");
				  }
			  }
		  });*/
		  /*var $allChild = $(':header', $(this));
		  $allChild.each(function(){
			  var $ele = $(this);
			  var currentSize = parseInt($ele.css("font-size"));
			  var currentLeading = parseInt($ele.css("line-height"));
			  
			  if (settings.unit == "percent") {
				  $(this).css("font-size", Math.round( currentSize * delta));
				  if (settings.adjustLeading) {
					  $(this).css("line-height", Math.round( currentLeading * delta));
				  }
			  } else {
				
				  $(this).css("font-size", (currentSize + delta) + "px");
				  if (settings.adjustLeading){
					  
					  $(this).css("line-height", (currentLeading + delta) + "px");
				  }
			  }
		  });*/
		  /*$.fn.fontscale.fontUpdate(object, settings, delta);*/
	   });
  }
  
  $.fn.fontscale.savecookie = function( delta, settings ) {

    //delete the cookie if we're performing a reset, do nothing else
    if (delta == "delete") {
      //$.cookie( settings.cookieName, null, settings.cookieParams );
	  $.cookie( settings.cookieName, "delta="+0+"&unit="+settings.unit+"&currentcount="+0, settings.cookieParams);
      return true;
    }
        
    if ($.cookie( settings.cookieName )) {
      properties = $.fn.fontscale.readcookie( settings.cookieName );
    } else {
      properties = {"delta":0}
    }
        
    //if we have a cookie that matches, just change the delta
    if (settings.unit == properties.unit) {  

      if (settings.unit == "percent") {
        properties.delta = (delta) ? properties.delta * delta : 1 ;
      } else {
        properties.delta = parseInt(properties.delta) + delta;
      }
    
      return $.cookie( settings.cookieName, "delta="+properties.delta+"&unit="+properties.unit+"&currentcount="+settings.currentCount, settings.cookieParams);
    
    //no cookie that matches, create a new     
    } else {
      $.cookie( settings.cookieName, "delta="+delta+"&unit="+settings.unit+"&currentcount="+settings.currentCount, settings.cookieParams);
      return true;
    }
      
  };
  
  $.fn.fontscale.readcookie = function( the_cookie ) {
  
    val_string = $.cookie( the_cookie );
                
    var objResult = {};
    $.each(val_string.split("&"), function() { 
      var prm=this.split("=");
      objResult[prm[0]] = prm[1]; 
    });
    return objResult;
  };

})(jQuery);

$.fn.fontscale.defaults = {
  useCookie:true,
  cookieName:'fontscale',
  cookieParams:{
    expires:30,
    path:"/"},
  increment:2,
  unit:"px",
  adjustLeading:false,
  event:"click",
  cookieLoaded:false,
  minCount:0,
  maxCount:0,
  currentCount:0
};
	

