﻿var IS_CSS_COLUMNS_SUPPORTED = (function() {
  var docEl = document.documentElement, s;
  if (docEl && (s = docEl.style)) {
      return typeof s.columnWidth == "string"
        || typeof s.MozColumnWidth == "string"
        || typeof s.WebkitColumnWidth == "string"
        || typeof s.KhtmlBcolumnWidth == "string";
  }
  return null;
})();

(function($) {

var splitHTML = function(block,height) {

	splitHTMLhelper(block, block, height);
	var block2 = $(block).clone();		
	return block2;
};

var splitHTMLhelper2 = function(block, blockoffset, text, height, start, stop, mid) {


	var text1 = '<span class="col_split_1">' + text.substr(0, mid) + '</span><span class="col_split_2">' + text.substr(mid, text.length-mid) + '</span>';
	var text2 = '<span class="col_split_1">' + text.substr(0, stop) + '</span><span class="col_split_2">' + text.substr(stop, text.length-stop) + '</span>';

	if (stop - start <= 4)
	{
		$(block).html(text1);
		return start;
	}

	$(block).html(text2);	 	
	var sub2 = $(block).children().get(0), $sub2 = jQuery(sub2); 
	var suboffset2 = $(sub2).offset().top - blockoffset;
	var testHeight2 = $(sub2).outerHeight() + suboffset2;

	if (testHeight2 > height)
	{
		
		$(block).html(text1);	
		var sub1 = $(block).children().get(0), $sub1 = jQuery(sub1);
		var suboffset1 = $(sub1).offset().top - blockoffset;
		var testHeight1 = $(sub1).outerHeight() + suboffset1;
		
		if (testHeight1 > height)
		{ 
			var newstart = start;
			var newstop = mid;
			var newmid = Math.floor((mid-start)/2);
			var keepstart3 = splitHTMLhelper2(block, blockoffset, text, height, newstart, newstop, newmid);
			var sub3 = $(block).children().get(0), $sub3 = jQuery(sub1);
			var text3 = $(block).html();
			var suboffset3 = $(sub3).offset().top - blockoffset;
			var testHeight3 = $(sub3).outerHeight() + suboffset3;
			
			keepstart = keepstart3; keeptext = text3;
	
		}
		else
		{
			
			var newstart = mid;
			var newstop = stop;
			var newmid = mid + Math.floor((stop-mid)/2);
			var keepstart3 = splitHTMLhelper2(block, blockoffset, text, height, newstart, newstop, newmid);
			var sub3 = $(block).children().get(0), $sub3 = jQuery(sub1);
			var text3 = $(block).html();
			var suboffset3 = $(sub3).offset().top - blockoffset;
			var testHeight3 = $(sub3).outerHeight() + suboffset3;
			
			if (keepstart3 < start) {
				keepstart = start; keeptext = text1;
			}
			else {
				keepstart = keepstart3; keeptext = text3;
			}

		}
	
	}
	else
	{ 
	
		keepstart = stop; keeptext = text2;
	}
	
	$(block).html(keeptext);
	return keepstart;
};



var splitHTMLhelper = function(block, base, height) {

	var childs = block.childNodes; 
	var blocks = new Array();
	var testHeight = 0;
	var runningHeight = 0;
	var childNum = 0;
	var blockoffset = $(base).offset().top;
	var blockHeight = $(base).outerHeight();
	var curr = 0; var len = childs.length;

	if (block.nodeType != 3) {
	
		tagName = block.tagName.toUpperCase();
		childoffset = $(block).offset().top - blockoffset;
		childHeight = $(block).outerHeight() + childoffset;
	
		if (tagName == "IMG" || tagName == "OBJECT" || tagName == "VIDEO") {
			if (childHeight > height) {
				$(block).wrap('<span class="col_split_2"></span>');
			}
			else {
				$(block).wrap('<span class="col_split_1"></span>');
			}
		}
		else {
	
			for (i=0; i < len; i++) {
				blocks[i] = childs[i];
			}
			for (i=0; i < len; i++) {
	
				var child = blocks[i], $child = jQuery(child);
				var nodeType = child.nodeType;
				var tagName = child.tagName;
				if (typeof tagName === "undefined") tagName = "#";
			
				if (nodeType == 3) {
					var newtext = "<span>"+$(child).text()+"</span>";
					var newchild = document.createElement('span');
					$(newchild).text($(child).text());
					$(child).replaceWith(newchild);
					child = newchild, $child = jQuery(newchild);
				}
				
				if (child.childNodes > 1) {
					splitHTMLhelper(child, base, height);
				}
				else {	
					tagName = child.tagName.toUpperCase();
					childoffset = $(child).offset().top - blockoffset;
					childHeight = $(child).outerHeight() + childoffset;
	
					if (tagName == "IMG" || tagName == "OBJECT" || tagName == "VIDEO") {
						if (childHeight > height) {
							$(child).wrap('<span class="col_split_2"></span>');
						}
						else {
							$(child).wrap('<span class="col_split_1"></span>');
						}
					}
					else {
		
						var text = $(child).html();
						
						var start = Math.floor(((blockHeight) / height) * text.length);
						
						
						if (start > text.length) { start = text.length; } 
					
						var newtext = text;
						var oldtext = '<span class="col_split_2">' + text + '</span>';
			
						var keepstart = 0;
						
						var keepstart1 = splitHTMLhelper2(child, blockoffset, text, height, 0, text.length, start);
						$(child).html(text);
				
						if (keepstart1 > keepstart) keepstart = keepstart1;
						if (keepstart > text.length) keepstart = text.length;
		
						for (j= keepstart ; j <= text.length; j++) {
		
							newtext = '<span class="col_split_1">' + text.substr(0, j) + '</span><span class="col_split_2">' + text.substr(j, text.length - j) + '</span>';
							
							$(child).html(newtext);
							var sub1 = $(child).children().get(0), $sub1 = jQuery(sub1);
							var suboffset = $(sub1).offset().top - blockoffset;
							
							var testHeight2 = $(sub1).outerHeight() + suboffset;
							if (testHeight2 > height) {
					
								newtext = oldtext;
								$(child).html(newtext);
								testHeight = testHeight2;
								
								break;
							}
							oldtext = newtext;
						}
					}
				}
				
				if (nodeType == 3) {
					$(child).replaceWith($(child).html());
				}
		
			}
		}
	}
	else {

	}
};

var collapseEmpty = function(block) {
	var childs = block.childNodes; 
	var len = (typeof block.childNodes === 'undefined') ? 0 : childs.length;

	var isEmpty = true; 
	if (len == 0) {  	
		var tagName = typeof block.nodeType === "undefined" ? "#" : block.tagName;
		tagName = tagName.toUpperCase(); 	

		if ($(block).text() != "" || (tagName == "IMG" || tagName == "OBJECT" || tagName == "VIDEO")) {
			return false;
		}
		else {	
			$(block).remove();
			return true;
		}
	}
	else {

		var blocks = new Array();
		for (i=0; i < len; i++) {
			blocks[i] = childs[i];
		}
		for (i=0; i < len; i++) {
			var child = blocks[0], $child = jQuery(child);
			var thisEmpty = false;
			if (child.nodeType == 3)  {
				if ($(child).html() === "")
					{ thisEmpty = true; }
			}
			else
				thisEmpty = collapseEmpty(child);
			
			isEmpty = isEmpty && thisEmpty;
		} 
		if (isEmpty) {
			$(block).remove(); }

	}
	return isEmpty;
};


var methods = {
	init : function(options) {
	
		var width = options.width;
		var gap    = options.gap;

		this.each(function() {
	
				
			var elem = this, $elem = jQuery(elem);
			$elem.data('columns.options', options);
			var height = parseInt($elem.css('height'));
			
			var children = $elem.children();

			var columns = 0;
			var currentHeight = 0;
			var column = document.createElement('div');
			var oldcolumn = column;
			columns++;
			$(column).css({'white-space':'normal','width':width,'display':'inline-block','vertical-align':'top','margin-right':gap});
			$(column).addClass('column');

			$elem.prepend(column);
			var floated = null;
			var insfloat = null;
			var insfloat2 = null;
			var diffHeight = 0;
			children.each(function() {
		
				var child = this, $child = jQuery(child);
				
				$(child).appendTo(column);
				var tx = $(child).text();
				var testHeight = $(column).innerHeight();
					
				var floating = $(child).css("float") != "none";
		
				if (testHeight > height && !floating)
				{
				
					diffHeight = height - currentHeight; 
					var thisHeight = $(this).outerHeight();
					var ratio = diffHeight / thisHeight;

					currentHeight = 0;
					oldcolumn = column;
					column = document.createElement('div');
					columns++;
					$(column).css({'white-space':'normal','width':width,'display':'inline-block','vertical-align':'top','margin-right':gap});
					$(column).addClass('column');
					$(oldcolumn).after(column);
					coloffset = $(column).offset().top;
					
				} else if (!floating) { currentHeight = testHeight }
				if (testHeight > height && floating) {
					
					floated = child;
					$(child).remove();	
				}
				
				if (testHeight > height && !floating) {

					if (floated != null)
					{ $(floated).appendTo(column); floated = null;  }
				
					var block = splitHTML(child, diffHeight);

					$(block).appendTo(column);
					
					$(child).find('.col_split_1').each(function()
					{
						$(this).replaceWith($(this).html());
					});
					
					$(block).find('.col_split_2').each(function()
					{
						$(this).replaceWith($(this).html());
					});
					
					$(child).find('.col_split_2').remove();
					$(block).find('.col_split_1').remove();
					
					 collapseEmpty(child);
					 collapseEmpty(block);	

				}
			else {  }
			 });
			
			var children = $elem.children();
		
			$elem.data('columns.count',columns);
			
			$elem.data('columns.outerWidth', columns * width + columns * gap - gap);
			$elem.data('columns.children',children);
			
		  });
		
		
	}
	
	
};



jQuery.fn.columns  = function(method) {
	
	if ( methods[method] ) {
	      return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
	    } else if ( typeof method === 'object' || ! method ) {
	      return methods.init.apply( this, arguments );
	    } else {
	      $.error( 'Method ' +  method + ' does not exist on jQuery.page' );
	    }    

};


})(jQuery);

(function($) {

var init = {
	css3 : function(options) {
	
	
		var columnMargin  = options.columnMargin;
		var gutterMargin  = options.gutterMargin;
		var height         = options.height;

		this.each(function() {
		
			var elem = this, $elem = jQuery(elem);
			$elem.data('reader.options', options);
			
			
			var outerWidth = $elem.innerWidth();
			
			var innerWidth = outerWidth - gutterMargin;
		
			var par = $elem.parent().get(0), $par = jQuery(par);
			
			var wrap = document.createElement('div'), $wrap = jQuery(wrap);
		
		
			$elem.css({ 'height' : height });

			
			$wrap.css({
						'width' : outerWidth,
						'white-space' : 'nowrap',
						'position' : 'relative',
						'width' : 'auto',
						'overflow' : 'hidden',
						
						});
		
			$wrap.addClass('reader');
							
			$elem.css({ 'white-space' : 'normal'});					
			$elem.wrap(wrap);
			wrap = $elem.parent().get(0), $wrap = jQuery(wrap);
			$wrap.prepend('<a name="navtop"></a>');		
			
			$elem.css({
					'width' : innerWidth,
					'column-gap' : columnMargin,
					'column-width' : innerWidth,
					'-webkit-column-gap' : columnMargin,
					'-webkit-column-width' : innerWidth,
					'-moz-column-gap' : columnMargin,
					'-moz-column-width' : innerWidth,
					
					});
						
						
			var width = wrap.scrollWidth;
			var cols = (width + columnMargin) / (innerWidth + columnMargin);
	
			if (cols <=1) {
				$elem.css({ 'height' : 'auto'  });
				$elem.css({
						'width' : 'auto',
						'column-gap' : 'auto',
						'column-width' : 'auto',
						'-webkit-column-gap' : 'auto',
						'-webkit-column-width' : 'auto',
						'-moz-column-gap' : 'auto',
						'-moz-column-width' : 'auto',
							
				});
			}
						
			var navbar = document.createElement('div'), $navbar = jQuery(navbar);
			$navbar.css({ 'width': outerWidth});
			$navbar.addClass('reader-nav');
			$navbar.data('reader.column', 0);
			$wrap.after(navbar);
			
			var nav;
			if (cols > 1) {
				for (currentColumn=0; currentColumn < cols; currentColumn++)
				{
	
					nav = document.createElement('span'), $nav = jQuery(nav);
					if (currentColumn == 0) $(nav).addClass('selected');
					$nav.data('reader.column',currentColumn);
					$nav.html('<a href="#navtop">' + (currentColumn+1) +'</a> ');
					
					$nav.click(function()
					{
						var column = $(this).data('reader.column');
						var oldCol = $navbar.data('reader.column');
						if (column != oldCol)
						{
							var scrollTo = innerWidth * column + (columnMargin * column)  - gutterMargin / 2;
							if (scrollTo < 0) scrollTo = 0;
							
							if ($elem.css('height') != 'auto')
							{
							
								$elem.css({ 'height' : height });
								$elem.css({
											'width' : innerWidth,
											'column-gap' : columnMargin,
											'column-width' : innerWidth,
											'-webkit-column-gap' : columnMargin,
											'-webkit-column-width' : innerWidth,
											'-moz-column-gap' : columnMargin,
											'-moz-column-width' : innerWidth,
											
											});
	
							}
							
							
							$wrap.scrollTo(scrollTo, 200);
							$(this).toggleClass('selected');
		
							var oldNav = $navbar.children().get(oldCol);
							$(oldNav).removeClass('selected');
							$navbar.data('reader.column', column);
						}
					});
					
					$navbar.append(nav);
					
		
	
				}
			}
			if (cols > 1) {
				var nav = document.createElement('span'), $nav = jQuery(nav);
				$nav.data('reader.column',-1);
				$nav.addClass('full_text');
				$nav.html('<a>Full Text</a> ');
				if (cols  == 1) {
					 $(nav).addClass('selected');
					 $navbar.data('reader.column', -1);
				}
			}
			
			$nav.click(function() {
					var column = $(this).data('reader.column');
					var oldCol = $navbar.data('reader.column');
					if (column != oldCol) {
						var scrollTo = innerWidth * column + (columnMargin * column)  - gutterMargin / 2;
						if (scrollTo < 0) scrollTo = 0;
						$wrap.scrollTo(scrollTo, 0);
						$elem.css({ 'height' : 'auto'  });
						$elem.css({
									'width' : 'auto',
									'column-gap' : 'auto',
									'column-width' : 'auto',
									'-webkit-column-gap' : 'auto',
									'-webkit-column-width' : 'auto',
									'-moz-column-gap' : 'auto',
									'-moz-column-width' : 'auto',
									
									});
 						
						
						$(this).toggleClass('selected');
	
						var oldNav = $navbar.children().get(oldCol);
						$(oldNav).removeClass('selected');
						$navbar.data('reader.column', column);
					}
			});
			
			$navbar.append(nav);

		
			
		});	

	},
	
	css2 : function(options) {
	
		var columnMargin  = options.columnMargin;
		var gutterMargin  = options.gutterMargin;
		var height         = options.height;
		
		this.each(function() {
			
			var elem = this, $elem = jQuery(elem);
			$elem.data('reader.options', options);
			var flat = $(this).clone(), $flat = jQuery(flat);

			$flat.css({'visibility':'collapse', 'height':'0', 'display':'none'});
		
			
			var outerWidth = $elem.innerWidth();
			
			var innerWidth = outerWidth - gutterMargin;
		
			var par = $elem.parent().get(0), $par = jQuery(par);
			
			var wrap = document.createElement('div'), $wrap = jQuery(wrap);
		
			$elem.before('<a name="navtop"></a>');	

			
			$elem.css({ 'height' : height });
			$(this).columns({width:innerWidth, gap:columnMargin});
			
			$elem.css({
					'width' : outerWidth,
					'overflow' : 'hidden',
					'position':'relative',
					'white-space':'nowrap',
				
					});
			$elem.addClass('reader');

			var width = elem.scrollWidth - columnMargin;
			var cols = (width + columnMargin) / (innerWidth + columnMargin);
			cols = Math.floor(cols);
		
			if (cols <=1) {
				$elem.css({ 'height' : 'auto'  });
				$elem.css({
						'width' : 'auto',
						'column-gap' : 'auto',
						'column-width' : 'auto',
						'-webkit-column-gap' : 'auto',
						'-webkit-column-width' : 'auto',
						'-moz-column-gap' : 'auto',
						'-moz-column-width' : 'auto',
							
				});
			}
			


			
			var navbar = document.createElement('div'), $navbar = jQuery(navbar);
			$navbar.css({ 'width': outerWidth});
			$navbar.addClass('reader-nav');
			$navbar.data('reader.column', 0);
			$elem.after(navbar);
			$elem.after(flat);
			var nav;
			if (cols > 1) {
				for (currentColumn=0; currentColumn < cols; currentColumn++)
				{
	
					nav = document.createElement('span'), $nav = jQuery(nav);
					if (currentColumn == 0) $(nav).addClass('selected');
					$nav.data('reader.column',currentColumn);
					$nav.html('<a href="#navtop">' + (currentColumn+1) +'</a> ');
					
					$nav.click(function()
					{
						var column = $(this).data('reader.column');
						var oldCol = $navbar.data('reader.column');
						if (column != oldCol)
						{
							var scrollTo = innerWidth * column + (columnMargin * column)  - gutterMargin / 2;
							if (scrollTo < 0) scrollTo = 0;
							
							if ($flat.css('visibility') != 'collapse')
							{
								$elem.css({'visibility':'visible', 'height':'auto'});
							 	$flat.css({'visibility':'collapse', 'height':'0', 'display':'none'});
 								
							}

							
							$elem.scrollTo({left:scrollTo,top:0}, 200);
							$(this).toggleClass('selected');
		
							var oldNav = $navbar.children().get(oldCol);
							$(oldNav).removeClass('selected');
							$navbar.data('reader.column', column);
						}
					});
					
					$navbar.append(nav);
					
		
	
				}
			}
			if (cols > 1) {	
				var nav = document.createElement('span'), $nav = jQuery(nav);
				$nav.data('reader.column',-1);
				$nav.addClass('full_text');
				$nav.html('<a>Full Text</a> ');
				if (cols  == 1) {
					 $(nav).addClass('selected');
					 $navbar.data('reader.column', -1);
				}
			}
			$nav.click(function() {
					var column = $(this).data('reader.column');
					var oldCol = $navbar.data('reader.column');
					if (column != oldCol) {
						var scrollTo = innerWidth * column + (columnMargin * column)  - gutterMargin / 2;
						if (scrollTo < 0) scrollTo = 0;
						$elem.scrollTo(scrollTo, 0);

 						$elem.css({'visibility':'collapse', 'height':'0'});
 						$flat.css({'visibility':'visible', 'height':'auto', 'display':'block'});

						$(this).toggleClass('selected');
	
						var oldNav = $navbar.children().get(oldCol);
						$(oldNav).removeClass('selected');
						$navbar.data('reader.column', column);
					}
			});
			
			$navbar.append(nav);

		
		});

	}

};


var methods = {
	init : function(options) {
	if (IS_CSS_COLUMNS_SUPPORTED) {
		init["css3"].apply(this, arguments); }
	else {
		init["css2"].apply(this, arguments); }
	}
	
	
};



jQuery.fn.reader  = function(method) {
	
	if ( methods[method] ) {
	      return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
	    } else if ( typeof method === 'object' || ! method ) {
	      return methods.init.apply( this, arguments );
	    } else {
	      $.error( 'Method ' +  method + ' does not exist on jQuery.page' );
	    }    

};


})(jQuery);
