﻿var paddingTop 			= 0;
var paddingBottom 		= 0;
var paddingLeft 		= 0;
var paddingRight 		= 0;
var borderHorizontal    = 0;
var borderVertical 		= 0;
var bodyWidth 			= 0;
var bodyHeight			= 0;
var bodyDiv 			= 0;
var	headerRowDiv 		= null; // ROW HEADER DIV
var	headerColumnDiv 	= null;	// COL HEADER DIV
var topHeaderOverflow   = null;
var leftHeaderOverflow  = null;
var	bodyDiv 			= null; // MATRIX CONTENT
var	cornerDiv 			= null; // CORNER DIV
var idFirstCol = "noneHeader";
var idFirstRow = "none";
var isSafari2  = false;


/*** 
* TEST SAFARI < 3 
*/
function testIfSafari2() {
	navUsag = navigator.userAgent;
	if(  (navUsag.indexOf("Version") == -1) && 
		 (navUsag.indexOf("Safari") !=-1 )) { 
			return true;
	} else return false;
	
}


function ScrollTable(theBorderHorizontal, theBorderVertical)
{
	headerRowDiv 	= $('div#headerRow')[0]; 		// ROW HEADER DIV
	headerColumnDiv = $('div#headerColumn')[0];		// COL HEADER DIV
	bodyDiv 		= $('div#bodyTable')[0]; 		// MATRIX CONTENT
	cornerDiv 		= $('div#corner')[0]; 			// CORNER DIV
	topHeaderOverflow = $('div#topHeaderOverflow')[0];
	leftHeaderOverflow = $('div#leftHeaderOverflow')[0];

	borderHorizontal = theBorderHorizontal;
	borderVertical   = theBorderVertical;
	
	isSafari2 = testIfSafari2();
	
	
	ResizeScrollArea();
	
	bodyDiv.onscroll = SyncScroll;
	if (borderHorizontal != null)	window.onresize = QueueResizeScrollArea;

}


var scheduledResizeArray = [], cnt=0;
function QueueResizeScrollArea()
{
    if (!mutexResize)
        console.debug("pushed: ", scheduledResizeArray.push(window.setTimeout(DequeueResizeScrollArea,50)));
}
var mutexResize;
function DequeueResizeScrollArea(len)
{
    scheduledResizeArray.pop();
    if (scheduledResizeArray.length == 0 && !mutexResize)
    {
        mutexResize = true;
        console.debug("got mutex");
        ResizeScrollArea();
        window.setTimeout(returnMutex, 500);
    }
    else
    {
        console.debug("not me: ", scheduledResizeArray.length, new Date());
    }
}

function returnMutex()
{
    console.debug("gave mutex back");
    if (location.hash) location.hash = location.hash;
    mutexResize = false;
}

function ResizeScrollArea()
{

    // Set scrollbar breadth
	var isIE 			= true;
	var scrollbarWidth  = 17;

	if (!document.all) 	{ isIE = false; scrollbarWidth = 19; }
	
	// set defaults
	$(bodyDiv).css("overflow","scroll");
	$(bodyDiv).css("overflowX","scroll");
	$(bodyDiv).css("overflowY","scroll");
	var scrollX = true;
	var scrollY = true;
	
	// calculate desired width
	var leftColumnDims = getDimensions(headerColumnDiv);
	var maxWidth = document.documentElement.clientWidth - borderHorizontal - leftColumnDims.width;
	var width = maxWidth;
	
	// calculate desired height
	var topHeaderDims = getDimensions(headerRowDiv);
	topHeaderDims.width = $('table#headerRowTable')[0].offsetWidth;
	var maxHeight = document.documentElement.clientHeight - borderVertical - topHeaderDims.height;
	var height = maxHeight;

	if(!isSafari2) {
				// if body dims are smaller than max, collapse and hide scrollbars
				if (maxWidth >= topHeaderDims.width)
				{
					// body is narrower than maxWidth
					width = topHeaderDims.width;
					bodyDiv.style.overflowX = "hidden";
					scrollX = false;
					$('.remote').hide();
					
				} else $('.remote').show();
				if (maxHeight >= leftColumnDims.height)
				{
					height = leftColumnDims.height;
					bodyDiv.style.overflowY = "hidden";
					scrollY = false;
					
				}
	} else {
	
				// if body dims are smaller than max, collapse and hide scrollbars
				if (maxWidth >= topHeaderDims.width)
				{
					
					// body is narrower than maxWidth
					width = topHeaderDims.width;
					//$(bodyDiv).css("width",bodyDiv.style.width+scrollbarWidth)
					scrollX = true;
					$('.remote').hide();
					
				} else $('.remote').show();
				if (maxHeight >= leftColumnDims.height)
				{
					height = leftColumnDims.height;
					//$(bodyDiv).css("height",bodyDiv.style.height+scrollbarWidth)
					scrollY = true;
					
				}
				
				height = height - 100;
				
		
		
		
	}

    // set dimensions 
	$('#topHeaderOverflow').css('width', width + "px"); //overflow does not work in pretty much all browsers, so set dims
	$('#leftHeaderOverflow').css('height', height + "px");
	bodyDiv.style.width 			= width + (scrollY ? scrollbarWidth : 0) + "px";
	bodyDiv.style.height 			= height + (scrollX ? scrollbarWidth : 0) + "px";

	startRemoteControl(); // Compute Max Scroll on Matrix 

    SyncScroll();


}

function marginCorner() {
	dim = $('#cornerDIV').height() - $('#cornerDIV div').height() - 5;
	if(dim>=0) 	$('#cornerDIV div').css("border-top",dim+"px solid white"); 
}


function resizeCorner() {
	/**************************************************************************
	 * RESIZE ALL HEADERS OR CORNER
	 **************************************************************************/
	var cornerDIV 		= $('#cornerDIV'); 
	var headerROW 		= $('#headerRow')[0];
	var cornerDIVDims   = getDimensions(cornerDIV);
	var cornerDIVHeight = cornerDIVDims.height;
	var headerROWHeight = getDimensions(headerROW).height;
	

	// HEADERS HEIGHT Uniformnization with CORNER
	//console.log("heights for corner: " + cornerDIVHeight + ', and headerRow: ' + headerROWHeight);
	if(	cornerDIVHeight > headerROWHeight) {
		$(headerROW).css("height",cornerDIVHeight)
	} 
    else if (cornerDIVHeight < headerROWHeight)
    {
		$(cornerDIV).css("height",headerROWHeight)
	}
	
	var height = Math.max(cornerDIVHeight, headerROWHeight);
	
	marginError = 1;
	if($.browser.mozilla) marginError = 0;
	$('#innerTable').css("margin-top", -height + marginError);
	marginCorner();
	//alert("OK");
}


function resizeCornerAfterColDeletion() {
	prodOffsets = 0;		// Updated scrolling info

	var cornerDIV 		= $('#cornerDIV'); 
	var headerROW 		= $('#headerRow')[0];
	var headerROWHeight = getDimensions(headerROW).height;
	$(cornerDIV).css("height",headerROWHeight);
	$('#cornerDIV div').css("border-top","0px solid white"); 
	var IEBUG = 1;
	//if($.browser.msie && window.XMLHttpRequest) IEBUG=1; // IE7 only
	marginError = 1;
	if($.browser.mozilla) marginError = 0;
	$('#innerTable').css("margin-top", -headerROWHeight + marginError);
	marginCorner();

}



function getDimensions(element) {
    var display = $(element).css('display');
    if (display != 'none' && display != null && $(element).is(':visible') 
        && typeof element.offsetWidth != 'undefined' && typeof element.offsetHeight != 'undefined')
    {
        return {width: element.offsetWidth, height: element.offsetHeight};
    }

    element = $(element);
 
 	// All *Width and *Height properties give 0 on elements with display none,
    // so enable the element temporarily
    var originalVisibility = element.css('visibility');
    var originalPosition = element.css('position');
    var originalDisplay = element.css('display');
    element.css('visibility','hidden');
    element.css('position','absolute');
    element.css('display','block');
    var originalWidth = element[0].clientWidth;
    var originalHeight = element[0].clientHeight;
    element.css('display',originalDisplay);
    element.css('position',originalPosition);
    element.css('visibility',originalVisibility);
    return {width: originalWidth, height: originalHeight};
}

var prodOffsets;
var zeroOffset;
var timer;
var maxSCROLL;

function startRemoteControl() {
	// COMPUTE MAX SCROLL
	tempScroll = bodyDiv.scrollLeft;
	bodyDiv.scrollLeft = 400000;
	maxSCROLL = bodyDiv.scrollLeft;
	bodyDiv.scrollLeft = tempScroll;

}




function scrollProducts(dir, pageSize)
{	
	clearTimeout(timer);
	
    if (!dir)        return;
    dir = dir / Math.abs(dir); // dir = sign(dir)   
    var thes = $('#headerRowTable th');
    var width = bodyDiv.offsetWidth;
    if (!prodOffsets)    cacheOffsets(thes);
    if (pageSize < 0) // start/end 
	 { bodyDiv.scrollLeft = dir < 0 ? 0 : 400000;  }
	else
    {
        var off;
        for (var len=prodOffsets.length, i=dir < 0 ? prodOffsets.length -1 : 0;   i<len && i >= 0;   i += dir)
        {
            var tmp = prodOffsets[i];
            if (tmp * dir < (bodyDiv.scrollLeft + (width * dir)) * dir)
                off = tmp;
			    //console.log(off);	
        }
        notbouncy(off, 5, .95);
    }

	
}

function notbouncy(offset, msec, friction, delta)
{

	 if (!delta)   delta = (offset - bodyDiv.scrollLeft) / 10;
   	bodyDiv.onscroll = null;
    topHeaderOverflow.scrollLeft = bodyDiv.scrollLeft += delta;
	bodyDiv.onscroll = SyncScroll;
	delta *= friction;
	if (Math.abs(delta) > 5 && Math.abs(offset - bodyDiv.scrollLeft) > Math.abs(offset - (bodyDiv.scrollLeft + delta))) {
	    timer=setTimeout("notbouncy(" + offset + "," + msec + "," + friction + "," + delta + ")", msec);
		if(bodyDiv.scrollLeft >= maxSCROLL) { clearTimeout(timer);  SyncScroll() }
	}
	else
	{
        topHeaderOverflow.scrollLeft = bodyDiv.scrollLeft = offset;
        SyncScroll();
		clearTimeout(timer)
    }
}

function cacheOffsets(thes)
{
    if (!thes) 
        thes = $('#headerRowTable th');
    prodOffsets = [];
    var first;
    thes.each(function(i){var curr = $(this).offsetLite().left; if (!first) first = curr; if (i > 0) prodOffsets[i] = curr - first;});
    prodOffsets[0] = 0;
}

function SyncScroll()
{
		// Scrollbars Synchronization
		topHeaderOverflow.scrollLeft 	= bodyDiv.scrollLeft;
		leftHeaderOverflow.scrollTop 	= bodyDiv.scrollTop;
        if (!prodOffsets)
            cacheOffsets();
        var first, last;
        for (var i=0,len = prodOffsets.length;i<len;++i)
        {
            if (first == null && i < len -1 && (prodOffsets[i] + prodOffsets[i+1]) / 2 >= bodyDiv.scrollLeft)
            {
               // console.log("first was " + i);
                first = i;
            }
            if (first != i && prodOffsets[i] < bodyDiv.scrollLeft + bodyDiv.offsetWidth 
                    - bodyDiv.offsetWidth / ((i - first) * 2) )
                last = i;
        }
        if (!last) last = prodOffsets.length - 1;
        $('#statusOfThings').html('Products ' + (first + 1) + " - " + (last + 1) + " of " + prodOffsets.length);
		
}