﻿
/*    
 ***********************************************************************************
 Version:       <v.1.0.7>
 Author:		<Evgeny Leontiev>
 Create date:   <27.10.2008>
 Description:	<Image Gallery Client Side>
 Modification:  <28.01.2009>
 ***********************************************************************************
*/



/* ******************** Full Image view ****************************************** */
var galImg = null;


//return big image name
function getBigImage(fn)
{   
    return fn.substring(0, fn.lastIndexOf(".jpg")) + "big.jpg";
}

function openGalleryFullImage(objImg)
{     
    var objGallery = null, popup = null, arr1 = null, galleryID = 0;

    var destPath = '/';
    if (location.href.indexOf('/CMS/') > -1) {return;
       /* var cPath = $('#clientPath').val();
        var lang = $('#lang').val();
        destPath = gPath.value; // + lang + '/');
        objImg.src = objImg.src.replace('/images/', gPath.value);*/
    }

    objGallery = getParentByClass(objImg, "galleryContainer");
    galleryID = objGallery.id.split("_")[1];
    popup = window.open(destPath + 'GalleryFullImageView.htm?image=' + getBigImage(objImg.src) + "&GalleryID=" + galleryID, 'popup' + galleryID, 'toolbar=no,location=no,menubar=no,directories=no,scrollbars=1,resizable=0'); 
    popup.focus();
}

//set popup navigation bars width
function setNavCont()
{    
    var nav1 = null, nav2 = null, picWidth = 0, navWidth = 0;    
    
    nav1 = document.getElementById("navCont1");
    nav2 = document.getElementById("navCont2");
    picWidth = galImg.clientWidth;
    navWidth = parseInt(picWidth/100*53);
    navWidth = navWidth < 300 ? 300 : navWidth;
    navWidth = navWidth > 500 ? 500 : navWidth;
    nav1.style.width = navWidth;
    nav2.style.width = navWidth;
}

//navigate to another picture
function popupNav(navType)
{    
    var objNav = null, popupImg = null, parentImg = null, objClick = null;        
    try
    {	
		objNav = getOpener().document.getElementById(navType + getRequestParam("GalleryID"));		
        if(navType == "next")
            nextPic(objNav);
        else
            prevPic(objNav);        
        showPopupImg();
    }
    catch(e)
    {
		window.close();
    }    
}

//return opener object
function getOpener()
{
    return navigator.appName == "Netscape" ? opener.parent : window.opener;
}

function showPopupImg()
{    
    var parentImg = null;
    try
    {
        galImg = null;
        galImg = document.createElement("img");    
        parentImg = getOpener().document.getElementById("parentImg" + getRequestParam("GalleryID"));    
        galImg.src = getBigImage(parentImg.src);
        galImg.title = parentImg.title;
        galDoUpdate();    
        setNavCont();
    }
    catch(e) { self.close(); }
}

//set popup navigation buttons
function setPopupNavButtons()
{
    var remotePrev = null, remoteNext = null, localPrev1 = null, objOpener = null,
        localPrev2 = null,  localNext1 = null, localNext2 = null, galleryID = 0;
    
    galleryId = getRequestParam("GalleryID");
    objOpener = navigator.appName == "Netscape" ? opener.parent : window.opener;
    remotePrev = objOpener.document.getElementById("prev" + galleryId);
    remoteNext = objOpener.document.getElementById("next" + galleryId);
    localPrev1 = document.getElementById("prev1");
    localPrev2 = document.getElementById("prev2");
    localNext1 = document.getElementById("next1");
    localNext2 = document.getElementById("next2");
    if(remotePrev.className == "pagerDisabled")
    {
        localPrev1.disabled = true;
        localPrev2.disabled = true;
        localPrev1.style.cursor = "default";
        localPrev2.style.cursor = "default";
    }
    else
    {
        localPrev1.disabled = false;
        localPrev2.disabled = false;
        localPrev1.style.cursor = "pointer";
        localPrev2.style.cursor = "pointer";
    }
    if(remoteNext.className == "pagerDisabled")
    {
        localNext1.disabled = true;
        localNext2.disabled = true;
        localNext1.style.cursor = "default";
        localNext2.style.cursor = "default";
    }
    else
    {
        localNext1.disabled = false;
        localNext2.disabled = false;
        localNext1.style.cursor = "pointer";
        localNext2.style.cursor = "pointer";
    }
}

//return param by name
function getRequestParam(paramName)
{    
    var params = null, arr1 = null, retValue = null;    
    var i = 0, j = 0;
    params = location.search.substring(1).split('&'); 
    for(i=0; i<params.length; i++)
    {
        if(params[i].indexOf("=") != -1)
        {
            arr1 = params[i].split("=");
            if(arr1[0] == paramName)
            {
                retValue = arr1[1];
                break;
            }
        }
    }
    return retValue;    
}

function galUpdateImage()
{ 
   if (galImg.width == 0 || galImg.height == 0)return false;   
   var constWidth = 940;   
   var w, h, flagW;
   if(galImg.width > constWidth)
   {
       w = constWidth;
       flagW = galImg.width/constWidth;
       h = parseInt(galImg.height/flagW);
   }    
   else
   {
        w = galImg.width;
        h = galImg.height;
   }   
   var imgString = "<img id='img1' src='"+galImg.src+"' width='"+w+"' height='"+h+"' style='BORDER: #000000 1px solid; ' alt='" + galImg.alt + "' title='" + galImg.title + "'/>";
   document.getElementById('img').innerHTML = imgString;  
   document.getElementById('img').height=h;   
   return true;
}

function galDoUpdate()
{
  if(!galUpdateImage())
      setTimeout(galDoUpdate,200);
  else
  {
     clearTimeout();
     setNavCont();
     setPopupNavButtons();
  }
}

function galMaximize()
{
	window.moveTo(0,0);
	window.resizeTo(screen.availWidth, screen.availHeight);
}
/* *********************************************************************************** */



/* ******************* Get Objects functions ***************************************** */
//top big image
function getGalleryBigImg(clickObj)
{    
    var cellObj = getParentByClass(clickObj, "galleryContainer").rows[0].cells[0];    
    return cellObj.childNodes[0].childNodes[0].rows[0].cells[0].childNodes[0];
}

//title below the image
function getGalleryTitle(clickObj)
{       
    return getParentByClass(clickObj, "galleryContainer").rows[1].cells[0].childNodes[0].rows[0].cells[1];
}

//find parent object with specific class name
function getParentByClass(obj, name)
{
    return obj.className == name ? obj : getParentByClass(obj.parentNode, name);
}

//return active page row
function getCurrentPage(clickObj)
{
    return getChildRowByClass(getParentByClass(clickObj, "galleryContainer"), "pageVisible");
}

//return page object by num
function getPage(clickObj, num)
{
    var rows = null, i = 0;
    rows = getParentByClass(clickObj, "galleryContainer").rows;    
    for(i=0; i < rows.length; i++)
    {
        if((rows[i].className == "pageVisible" || rows[i].className == "pageHidden") && rows[i].id == num)
            return rows[i];
    }
    return null;
}

//return current active image object
function getCurrentImg(clickObj)
{
    return getChildNodeByClass(getCurrentPage(clickObj).cells[0], "thumb1");
}

// get next / prev image
function getImg(clickObj, imgType)
{      
    var currentImg, nextImg, i = 0, j = 0, curImgIdx = -1;
    var rows = null, cells = null, cell = null;
    cell = getCurrentPage(clickObj).cells[0];    
    rows = cell.childNodes[0].rows;
    for(i=0; i<rows.length; i++)
    {
        cells = rows[i].cells;
        for(j=0; j<cells.length; j++)
        {
            if(cells[j].className == "thumb1")
            {                
                curImgIdx = j;
                break;
            }            
        }
        if(curImgIdx != -1) break;
    }
    return imgType == "next" ? getNextNonEmptyNode(rows, i, j, clickObj) : getPrevNonEmptyNode(rows, i, j, clickObj);
}

//return non-empty node
function getNextNonEmptyNode(rows, i, j, clickObj)
{
    var cell = null, node = null;
    j++;
    if(rows[i].cells[j] != null)
        cell =  rows[i].cells[j];
    else
    {
        i++;
        if(rows[i] != null)
            cell = rows[i].cells[0];
        else
        {   
            navPage(clickObj, "next");            
            cell = getFirstPageNode(clickObj);
        }
    }    
    node = cell.childNodes[0].childNodes[0];
    return node != null ? node : getNextNonEmptyNode(rows, i, j);
}

//return non-empty node
function getPrevNonEmptyNode(rows, i, j, clickObj)
{   
    var cell = null, node = null, idx = null;
    j--;
    if(j >=0 && rows[i].cells[j] != null)
        cell =  rows[i].cells[j];
    else
    {
        i--;        
        if(i >= 0 && rows[i] != null)
        {
            idx = rows[i].cells.length - 1;
            cell = rows[i].cells[idx];
        }
        else
        {
            navPage(clickObj, "prev");            
            cell = getLastPageNode(clickObj);
        }
    }    
    node = cell.childNodes[0].childNodes[0];
    return node != null ? node : getPrevNonEmptyNode(rows, i, j);    
}

//return 1st node on current page
function getFirstPageNode(clickObj)
{
    var objPage = null, node = null;
    
    objPage = getCurrentPage(clickObj);    
    node = objPage.cells[0].childNodes[0];    
    return node.rows[0].cells[0];
}

//return last node on current page
function getLastPageNode(clickObj)
{
    var objPage = null, node = null;
    var maxRowIdx = 0, maxCellIdx = 0;
    
    objPage = getCurrentPage(clickObj);    
    node = objPage.cells[0].childNodes[0];
    maxRowIdx = node.rows.length-1;
    maxCellIdx = node.rows[maxRowIdx].cells.length-1;
    return node.rows[maxRowIdx].cells[maxCellIdx];
}

//return image navigation butttons prev / next
function getImgNavButton(objClick, btnType)
{
    var objGallery, cellNum;
    objGallery = getParentByClass(objClick, "galleryContainer");
    cellNum = btnType == "next" ? 2 : 0;
    return objGallery.rows[1].cells[0].childNodes[0].rows[0].cells[cellNum].childNodes[0];
}

//return 1st image on the active page
function getFirstImage(objGallery)
{
    var innerTable, objImg;    
    innerTable = objGallery.rows[2].cells[0].childNodes[0];
    objImg = innerTable.rows[0].cells[0].childNodes[0].childNodes[0];
    return objImg;
}

//return total number of pages in current gallery
function getTotalPages(objGallery)
{   
    var node = null, cell = null, innerTbl = null, i = 0, count = 0;
    
    cell = getChildRowByClass(objGallery, "pager").cells[0];    
    innerTbl = cell.childNodes[0];
    node = innerTbl.rows[0].cells[1];
    return node.childNodes[0].rows[0].cells.length;
}

//return num of images on page and num of active image
function getCurPageInfo(objTnContainer)
{
    var cells = null, rows = null, node = null, count = 0, i = 0, j = 0, k = 0, curImgNum = 0, arr1 = null;    
    
    rows = objTnContainer.rows;
    for(i=0; i<rows.length; i++)
    {
        cells = rows[i].cells;
        for(j=0; j<cells.length; j++)
        {            
            if(cells[j].childNodes[k] != null && cells[j].childNodes[k].nodeName.toLowerCase() == "div" && cells[j].childNodes[k].childNodes.length > 0)
            {                
                node = cells[j].childNodes[0].childNodes[0].rows[0].cells[0].childNodes[0];
                if(node != null && node.nodeName.toLowerCase() == "img")
                {
                    count++;
                    if(cells[j].className == "thumb1")
                        curImgNum = count;
                }
            }
        }
    }
    arr1 = new Array(curImgNum, count);
    return arr1;
}

//returns child node in table by td class name
function getChildNodeByClass(objTable, c)
{
    var rows = null, cells = null, i = 0, j = 0;
    
    rows = objTable.rows;
    for(i=0; i<rows.length; i++)
    {
        cells = rows[i].cells;
        for(j=0; j<cells.length; j++)
        {
            if(cells[j].className == c)                
                return cells[i].childNodes[0];
        }
    }
    return null;
}

//returns child row in table by tr class name
function getChildRowByClass(objTable, c)
{
    var rows = null, i = 0;
    
    rows = objTable.rows;
    for(i=0; i<rows.length; i++)
    {
        if(rows[i].className == c)
            return rows[i];        
    }
    return null;
}

/* *********************** Paging ******************************************************************* */
//return pager's object by type
function getPagerBtn(objGallery, btnType)
{
    var node = null, cell = null, innerTbl = null, i = 0, count = 0, objReturn = null;
    
    cell = getChildRowByClass(objGallery, "pager").cells[0];    
    innerTbl = cell.childNodes[0];    
    if(btnType == "prev")
        objReturn = innerTbl.rows[0].cells[0].childNodes[0];
    else if(btnType == "next")
        objReturn = innerTbl.rows[0].cells[2].childNodes[0];
    else
        objReturn = innerTbl.rows[0].cells[1].childNodes[0];
    return objReturn;    
}

//return num pager's button by num
function getPagerBtnByNum(objGallery, num)
{
    var objButtons = null, i = 0, node = null;
    
    objButtons = getPagerBtn(objGallery, "num").rows[0].cells;
    for(i=0; i<objButtons.length; i++)
    {
        node = objButtons[i].childNodes[0];
        if(objButtons[i].nodeName.toLowerCase() == "td")
        {
            if(node.title == num)
                return node;
        }
    }
}

//return num of current page
function getCurrentPageNum(objGallery)
{
    var rows = null, i = 0, pageNum = 0;
    
    rows = objGallery.rows;
    for(; i < rows.length; i++)
    {
        if(rows[i].className == "pageVisible")
        {
            pageNum = parseInt(rows[i].id);
            break;
        }
    }
    return pageNum;
}

//set num buttons
function setPagerNums(objGallery, curPageNum, totalPages)
{   
    var i = 0, start = 0, end = 0, objPagerLink = null;
    
    for(i=1; i<=totalPages; i++)
    {
        objPagerLink = getPagerBtnByNum(objGallery, i);
        objPagerLink.className = "pagerNumHidden";
        objPagerLink.parentNode.style.display = "none";
    }
    
    if(curPageNum == 1 || curPageNum == 2)
    {
        start = 1;
        end = 3;
        if(end > totalPages) end = totalPages;
        for(i=start; i<=end; i++)
        {
            objPagerLink = getPagerBtnByNum(objGallery, i);
            objPagerLink.parentNode.style.display = "";
            if(i == curPageNum)
                objPagerLink.className = "pagerNumCurrent";
            else
                objPagerLink.className = "pagerNumEnable";
        }
    }
    else if(curPageNum == totalPages)
    {        
        end = curPageNum;
        start = end-2;
        if(start < 1) start = 1;
        for(i=start; i<=end; i++)
        {
            objPagerLink = getPagerBtnByNum(objGallery, i);
            objPagerLink.parentNode.style.display = "";
            if(i == curPageNum)
                objPagerLink.className = "pagerNumCurrent";
            else
                objPagerLink.className = "pagerNumEnable";
        }
    }
    else
    {
        start = curPageNum-1;
        end = curPageNum + 1;
        if(start < 1) start = 1;
        if(end > totalPages) end = totalPages;
        for(i=start; i<=end; i++)
        {
            objPagerLink = getPagerBtnByNum(objGallery, i);
            objPagerLink.parentNode.style.display = "";
            if(i == curPageNum)
                objPagerLink.className = "pagerNumCurrent";
            else
                objPagerLink.className = "pagerNumEnable";            
        }
    }    
}

//set pager buttons
function setPager(objGallery)
{   
    var totalPages = 0, curPage = 0, curImg = 0, totalImages = 0, i = 0, numButton = 0;
    var objNextImg = null, objPrevImg = null, objNextPage = null, objPrevPage = null, objNumBtn = null;
    
    totalPages = getTotalPages(objGallery);    
    curPageNum = getCurrentPageNum(objGallery);
    objNextPage = getPagerBtn(objGallery, "next");
    objPrevPage = getPagerBtn(objGallery, "prev");
    objNumBtn = getPagerBtn(objGallery, "num");
    
    if(curPageNum == totalPages)
        objNextPage.className = "pagerDisabled";
    else
        objNextPage.className = "pagerEnabled";        
    
    if(curPageNum == 1)
        objPrevPage.className = "pagerDisabled";
    else
        objPrevPage.className = "pagerEnabled";
    setPagerNums(objGallery, curPageNum, totalPages);
}
/* ************************************************************************************************* */


/* ************************* Set object functions  ************************************************* */
//set border on for thumbnail
function setBorderOn(clickObj)
{   
    var objTn = null;
    
    objTn = clickObj.tagName == "TABLE" ? clickObj.parentNode.parentNode : clickObj.parentNode;    
    objTn.className = "thumb1";
}

//set border off for thumbnail
function setBorderOff(clickObj)
{       
    var rows = null, cells = null, i = 0, j = 0;
    rows = getParentByClass(clickObj, "tnContainer").rows;    
    for(i=0; i < rows.length; i++)
    {
        cells = rows[i].cells;
        for(j=0; j<cells.length; j++)
        {
            if(cells[j].className == "thumb1")
                cells[j].className = "thumb";
        }
    }
}

//show big pic, change title, change borders, check nav buttons (when navigate)
function showPic(clickObj) {		
	setBorderOff(clickObj);
    var i = 0, imageName = "", imageTitle = "", objBigImg = null, imgTn = null;
	if(imgTn = clickObj.tagName == "TABLE")
	clickObj=$(clickObj).parent()[0];
    imgTn = clickObj.tagName == "TABLE" ? clickObj.rows[0].cells[0].childNodes[0] : clickObj.childNodes[0].rows[0].cells[0].childNodes[0];
    imageName = imgTn.alt;
    imageTitle = imgTn.title.replace('<', '&lt;').replace('>', '&gt;');
    objBigImg = getGalleryBigImg(clickObj);
    setMagniCur(objBigImg);
    objBigImg.src = imageName;
    objBigImg.title = imageTitle;	
    var titleObj = $(getGalleryTitle(clickObj));
    setBorderOn(clickObj);
    setNavButtons(clickObj);
    $(objBigImg).unbind('click');	
    titleObj.unbind('click');
    titleObj.html(imageTitle);
    var u = $(clickObj).attr('navUrl');
	
    if (u) {
        $(objBigImg).css('cursor', 'pointer');
        $(objBigImg).bind('click', { msg: u }, function (event) {
		var u = event.data.msg;            
		if (u.indexOf('http://') == -1)                
			window.document.location.href=u;
		else
			window.open(u);			
        });

        titleObj.bind('click', { msg: u }, function (event) {
            var u = event.data.msg;
            if (u.indexOf('http://') == -1)
                window.document.location.href=u;
            else
                window.open(u);
        });
    }
    else {
        $(objBigImg).css('cursor', 'url(images/magni.cur)');
        $(objBigImg).bind('click', { obj: $(objBigImg)[0] }, function (event) {
            openGalleryFullImage(event.data.obj);
        });

        titleObj.bind('click', { obj: $(objBigImg)[0] }, function (event) {
            openGalleryFullImage(event.data.obj);
        });
    }	
}

function imgNav(url)
{
	alert(url);
}

//set 1st image on the page active
function setFirstImage(objPage)
{   
    var objTnContainer = null, objImg = null;
    
    objTnContainer = objPage.cells[0].childNodes[0].childNodes[0];
    objImg = objTnContainer.rows[0].cells[0].childNodes[0].childNodes[0];
    showPic(objImg);
}

//set nav buttons next / prev for image
function setNavButtons(objClick)
{   
    var totalImages = 0, curImgNum = 0, totalPages = 0, curPageNum = 0;
    var objNextImg = null, objPrevImg = null, arr1 = null, objGallery = null, o
        bjNextPage = null, objPrevPage = null, objPage = null;
    
    objGallery = getParentByClass(objClick, "galleryContainer");
    objPage = getParentByClass(objClick, "tnContainer");
    arr1 = getCurPageInfo(objPage);
    curImgNum = arr1[0]; totalImages = arr1[1];    
    objPrevImg = getImgNavButton(objClick, "prev");
    objNextImg = getImgNavButton(objClick, "next"); 
    totalPages = getTotalPages(objGallery); 
    curPageNum = getCurrentPageNum(objGallery);
    
    if(curPageNum == totalPages && curImgNum == totalImages)
        objNextImg.className = "pagerDisabled";
    else
        objNextImg.className = "pagerEnabled";
    
    if(curPageNum == 1 && curImgNum == 1)
        objPrevImg.className = "pagerDisabled";
    else
        objPrevImg.className = "pagerEnabled";
}

//initial setup of galleries (start on body load)
function setGalleries()
{    
    var i = 0, objGallery = null, tables = null;
    
    tables = document.getElementsByTagName("TABLE");    
    for(i=0; i<tables.length; i++)
    {
        if(tables[i].className == "galleryContainer")
        {
            objGallery = tables[i];
            objGallery.style.visibility = "visible";
            showPic(getFirstImage(objGallery));
            setPager(objGallery);
        }
    }
}

//set magni cursor for big gallery image
function setMagniCur(obj)
{
    obj.style.cursor = "url(images/magni.cur),pointer;";
}

/* ************************************************************************************** */



/* ************************* Navigation *************************************************** */
//navigate to next picture in gallery
function prevPic(clickObj)
{    
    if(clickObj.className.toLowerCase().indexOf("disabled") != -1) return;    	
	showPic($(getImg(clickObj, "prev")).parent()[0]);
}

//navigate to prev picture in gallery
function nextPic(clickObj)
{		
    if(clickObj.className.toLowerCase().indexOf("disabled") != -1) return;	    	
	showPic($(getImg(clickObj, "next")).parent()[0]);
}

//navigate to page (next / prev / num)
function navPage(clickObj, navType)
{
    var cname = clickObj.className.toLowerCase();
    var objCurPage = null, objNextPage = null, num = 0;
    
    if(cname.indexOf("disabled") != -1 || cname.indexOf("current") != -1) return;
    objCurPage = getCurrentPage(clickObj);
    num = parseInt(objCurPage.id);
    switch(navType)
    {
        case "next":
            num++;
            break;
        case "prev":
            num--;
            break;
        case "page":
            num = clickObj.title;
            break;
    }    
    objNextPage = getPage(clickObj, num);
    if(getPage(clickObj, num) != null)
    {
        objCurPage.className = "pageHidden";
        objNextPage.className = "pageVisible";
        setFirstImage(objNextPage);
        setPager(getParentByClass(clickObj, "galleryContainer"));
    }    
}
/*****************************************************************************************/

