//////////////////////////////////////////////////
// API

var ScrollWin = {
    w3c: document.getElementById,
    iex: document.all,
    scrollLoop: false,
    scrollInterval: null, // setInterval id
    currentBlock: null, // object reference
    getWindowHeight: function(){
        if (this.iex) 
            return (document.documentElement.clientHeight) ? document.documentElement.clientHeight : document.body.clientHeight;
        else 
            return window.innerHeight;
    },
    getScrollLeft: function(){
        if (this.iex) 
            return (document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : document.body.scrollLeft;
        else 
            return window.pageXOffset;
    },
    getScrollTop: function(){
        if (this.iex) 
            return (document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop;
        else 
            return window.pageYOffset;
    },
    getElementYpos: function(el){
        var y = 0;
        while (el.offsetParent) {
            y += el.offsetTop
            el = el.offsetParent;
        }
        return y;
    },
    scroll: function(num){
        if (!this.w3c) {
            location.href = "#" + this.anchorName + num;
            return;
        }
        if (this.scrollLoop) {
            clearInterval(this.scrollInterval);
            this.scrollLoop = false;
            this.scrollInterval = null;
        }
        if (this.currentBlock != null) 
            this.currentBlock.className = this.offClassName;
        this.currentBlock = document.getElementById(this.blockName + num);
        this.currentBlock.className = this.onClassName;
        var doc = document.getElementById(this.containerName);
        var documentHeight = this.getElementYpos(doc) + doc.offsetHeight;
        var windowHeight = this.getWindowHeight();
        var ypos = this.getElementYpos(this.currentBlock);
        if (ypos > documentHeight - windowHeight) 
            ypos = documentHeight - windowHeight;
        this.scrollTo(0, ypos);
    },
    scrollTo: function(x, y){
        if (this.scrollLoop) {
            var left = this.getScrollLeft();
            var top = this.getScrollTop();
            if (Math.abs(left - x) <= 1 && Math.abs(top - y) <= 1) {
                window.scrollTo(x, y);
                clearInterval(this.scrollInterval);
                this.scrollLoop = false;
                this.scrollInterval = null;
            }
            else {
                window.scrollTo(left + (x - left) / 2, top + (y - top) / 2);
            }
        }
        else {
            this.scrollInterval = setInterval("ScrollWin.scrollTo(" + x + "," + y + ")", 100);
            this.scrollLoop = true;
        }
    }
};


window.LINTERP = function(coordsX, coordsY, _x){
    if (coordsX.length != coordsY.length) 
        throw 'coordsX.length!=coordsY.length';
    
    if (_x < coordsX[0] || _x > coordsX[coordsX.length - 1]) 
        return 0;
    
    for (var i = 0; i < coordsX.length - 1; i++) 
        if (_x >= coordsX[i] && _x <= coordsX[i + 1]) 
            return ((coordsY[i] - coordsY[i + 1]) / (coordsX[i] - coordsX[i + 1])) * (_x - coordsX[i + 1]) + coordsY[i + 1];
    return 0;
}

function getPos(el){
    var r = {
        x: el.offsetLeft,
        y: el.offsetTop
    };
    
    if (el.offsetParent) {
        var tmp = getPos(el.offsetParent);
        r.x += tmp.x;
        r.y += tmp.y;
    }
    return r;
}

function getScrollTop(obj){
    return obj.scrollTop;
}

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();	

//////////////////////////////////////////////////
// Application

var SCROLLTABLE = {};

SCROLLTABLE.event = {
    clientX: 0,
    clientY: 0
};
SCROLLTABLE.component = 0;
SCROLLTABLE.init = function(obj, event){
    this.component = obj;
    this.event.clientX = event.clientX;
    this.event.clientY = event.clientY;
}

POINT = function(){

    this.init = function(_x, _y){
        this.x = _x;
        this.y = _y;
    }
    
    this.init2 = function(point){
        if (!(point instanceof POINT)) 
            throw "!(point instanceof POINT)"
        this.x = point.x;
        this.y = point.y;
    }
    
    this.equals = function(point){
        if (!(point instanceof POINT)) 
            throw "!(point instanceof POINT)"
        return this.x == point.x && this.y == point.y;
    }
    
    
    this.x = 0;
    this.y = 0;
}

var MOUSE = new POINT();


var intervalMoving = 0;

var IMG = {};
IMG.height = 85 - 25;
IMG.width = 140 * (IMG.height / 85);

var arrTD = 0;
var arrIMG = 0;

var arrImgsToReduce = 0;
var prevMouseMoveTD = 0;

var strech_vY = 0;
var strech_vX = 0;

var strech_hY = 0;
var strech_hX = 0;

var oldMouseMove = new POINT();

function mousemove(obj, event){
    SCROLLTABLE.init(obj, event);
    
    var mouse = mouseDefinition();
    
    var left = 0;
    var top = 0;
    var right = obj.offsetWidth;
    var bottom = obj.offsetHeight;
    
    if (mouse.x < left + 40 || 
		mouse.x > right - 40 ||
	    mouse.y < top ||
	    mouse.y > bottom)
	{
        mousemoveExit(obj,event);
        return;
    }
    
    if (intervalMoving == 0) 
        intervalMoving = setInterval("scrollingImgs()", 20);
}

function mousemoveExit(obj, event){
    if (intervalMoving == 0) return;
    
	var mx=0;
	var my=0;
	
	
	//SCROLLTABLE.event.clientX 
 	mx = -getPos(obj).x + event.clientX + ScrollWin.getScrollLeft();
 	my = -getPos(obj).y + event.clientY + ScrollWin.getScrollTop();
	
	var left = 0;
    var top = 0;
    var right = obj.offsetWidth;
    var bottom = obj.offsetHeight;
    
//    alert(mx);
    
    if(
		mx < left + 20 || 
		mx > right - 20 ||
	    my < top+5 ||
	    my > bottom-5
	){
		
		clearInterval(intervalMoving);
	    intervalMoving = 0;
	    
		for (var i = -2; i <= 2; i++) {
	        if (prevMouseMoveTD + i < 0 || prevMouseMoveTD + i >= arrTD.length) continue;
		    setDefaultParamsImg(arrIMG[prevMouseMoveTD + i]);
	    }
    }
	
}



function setDefaultBorder(img){
    img.style.border = '0px solid rgb(70,70,70)';
}

function setHighlightBorder(img){
    img.style.border = '0px solid rgb(200,200,200)';
}


function reduceIMG(img){
    img.height = IMG.height;
    img.width = IMG.width;
}

function setDefaultParamsImg(img){
    setDefaultBorder(img);
    reduceIMG(img);
}


function mouseDefinition(){
    if (arrTD == 0) 
        arrTD = SCROLLTABLE.component.getElementsByTagName('TD');
    
    var tables = SCROLLTABLE.component.getElementsByTagName('table');
    var m = new POINT();
    
	//for IE
//	m.x = -getPos(SCROLLTABLE.component).x + SCROLLTABLE.event.clientX + ScrollWin.getScrollLeft();

	m.x = -getPos(SCROLLTABLE.component).x + SCROLLTABLE.event.clientX + ScrollWin.getScrollLeft();
    m.y = -getPos(SCROLLTABLE.component).y + SCROLLTABLE.event.clientY + ScrollWin.getScrollTop();
    
    return m;
}

function multipArray(arr, coeff){
    for (var i = 0; i < arr.length; i++) 
        arr[i] = arr[i] * coeff;
    return arr;
}

function scrollingImgs(){
    var mouseCoords = mouseDefinition();
    var _objHeight = SCROLLTABLE.component.offsetHeight;
    
    
    
    
    
    if(BrowserDetect.browser=='Mozilla' || BrowserDetect.browser=='Firefox')
    	var speed_y = 			  [-25,  -4,   -0,   0,   0,   2, 25];
    else
    	var speed_y = 			  [-60,  -10,   -0,   0,   0,   10, 60];
    	
    	
    	
    var speed_x = multipArray([  0, 0.15, 0.2, 0.5, 0.8, 0.85,  1], _objHeight);
    
    var _offset = LINTERP(speed_x, speed_y, mouseCoords.y);
    
    oldTableScrollTop = SCROLLTABLE.component.scrollTop;
    
    SCROLLTABLE.component.scrollTop += LINTERP(speed_x, speed_y, mouseCoords.y);
    
    currentScrollTop = SCROLLTABLE.component.scrollTop;
    
    resizingImgs();
}

var currentScrollTop = 0;
var oldTableScrollTop = 0;

function resizingImgs(){

    var event = SCROLLTABLE.event;
    var obj = SCROLLTABLE.component;
    
    var arrTD = obj.getElementsByTagName('TD');
    var remainingHeight = -getScrollTop(obj);
    
    var mouseCoords = mouseDefinition();
    
    var itemTD = 0;
    for (; itemTD < arrTD.length - 1; itemTD++) {
        if (remainingHeight + arrTD[itemTD].offsetHeight > mouseCoords.y) 
            break;
        remainingHeight += arrTD[itemTD].offsetHeight;
    }
    
    ////////////////////////////////////////////////
    var _itemTd = itemTD;
    var _itemTdOffsetTop = mouseCoords.y - remainingHeight;
    var _cellHeight = arrTD[itemTD].offsetHeight;
    var _cellWidth = arrTD[itemTD].offsetWidth;
    
    var _offsetFunctionResize = 2 * _cellHeight + 0.5 * _cellHeight - _itemTdOffsetTop;
    
    if (arrIMG == 0) 
        arrIMG = obj.getElementsByTagName('IMG');
    
    if (prevMouseMoveTD != _itemTd) 
        setDefaultBorder(arrIMG[prevMouseMoveTD])
    
    prevMouseMoveTD = _itemTd;
    
    setHighlightBorder(arrIMG[_itemTd]);
    
    if (oldMouseMove.equals(mouseDefinition()) && currentScrollTop == oldTableScrollTop) 
        return;
    
    if (strech_vY == 0 || strech_vY == 0 || strech_hX == 0 || strech_hY == 0) {
        strech_vY = multipArray([0, 1, 1.8, 2, 2.2, 3, 4], _cellHeight);
        strech_vX = [0, 10, 25, 25, 25, 10, 0];
        
        strech_hY = multipArray([0, 0.1, 0.25, 0.5, 0.75, 0.9, 1], _cellWidth);
        strech_hX = [0, 0.1, 0.25, 1, 0.25, 0.1, 0];
    }
    
    for (var i = -2; i <= 2; i++) {
        if (_itemTd + i >= arrTD.length || _itemTd + i < 0) 
            continue;
        
        var resizeY = LINTERP(strech_vY, strech_vX, _offsetFunctionResize + i * _cellHeight);
        
        if(BrowserDetect.browser=='Mozilla' || BrowserDetect.browser=='Firefox')
	    	var coeefX = LINTERP(strech_hY, strech_hX, mouseCoords.x-20);	
	    else
	    	var coeefX = LINTERP(strech_hY, strech_hX, mouseCoords.x);
    
    	var speed_y = 			  [-60,  -10,   -0,   0,   0,   10, 60];
        
        
        //coeefX=1;
        var _imgHeight = IMG.height + (coeefX * resizeY);
        var _imgWidth = IMG.width + (coeefX * (resizeY / arrIMG[_itemTd + i].height) * arrIMG[_itemTd + i].width);
        
        arrIMG[_itemTd + i].height = _imgHeight;
        arrIMG[_itemTd + i].width = _imgWidth;
    }
    
    oldMouseMove.init2(mouseDefinition());
}



function initTableImages(images, alts, id_projects){
    
    var _table = document.getElementById("table_images").tBodies[0];
    
    for (var i = 0; i < images.length; i++) {
        
    	var _tr = document.createElement('tr');
	        var _td = document.createElement('td');
	        
		        var _div =  document.createElement('div');
		        	_div.style.position  ='relative';
		        	//_span.style.border='1px solid red';
			        	
			        	var _img = document.createElement('img');
				        _img.src = images[i];
				        _img.width = IMG.width;
				        _img.height = IMG.height;
				        _img.alt = alts[i];
				        _img.id_project = id_projects[i];
				        _img.style.border = '1px solid green';
				        
				        _img.onclick = function(){ requestProjectInfo(this.id_project);}
			    		setDefaultBorder(_img);	
			    		
//			    		var _img2 = document.createElement('img');
//				        _img2.src = pictograms[i];
//				        _img2.style.position = 'absolute';
//				        _img2.width  = 4;
//				        _img2.height  = 4;
//				        _img2.style.left = '0px';
//				        _img2.style.top = '0px';
			    		
	    		
		    	_div.appendChild(_img);
//		    	_div.appendChild(_img2);
		    	
		    	
		    	
	        _td.appendChild(_div);
        _tr.appendChild(_td);
        
        //alert(_tr.innerHTML);
        
        _table.appendChild(_tr);
    }
}

function loadIMg(url)
{
if (url!='')
{ document.getElementById('main').src=url; }
}
