function getTVUrl( contentId, linkCategoryId ) {
    var url = core_getContextPath() + "/servlet/pc/nonavitem";
    url += "?siteID=" + cda_getSiteID() + "&id=" + contentId;
    if( linkCategoryId && linkCategoryId != "" ) {
        url += "&linkID=" + linkCategoryId;
    }
    if (cda_isPreview) url += "&preview=1";

    return url;
}

/**
 * onClick function when a category link is clicked on product center page
 * @param currentElement li element that triggers the onclick event
 */
function galleryNavigationOnClick(currentElement) {
    var clickedCategoryPos;
    // highlight clicked category
    var gallery_navigation_lis = document.getElementById('adsk101-gallery_navigation').getElementsByTagName('li');
    for(i=0;i<gallery_navigation_lis.length;i++) {
        gallery_navigation_lis[i].className = (gallery_navigation_lis[i] == currentElement) ? "current" : "";
        clickedCategoryPos = (gallery_navigation_lis[i] == currentElement) ? i : clickedCategoryPos;
    }

    // display clicked category's index
    var gallery_channels_uls = document.getElementById('adsk101-gallery_channels').getElementsByTagName('ul');

    for(i=0;i<gallery_channels_uls.length;i++) {
        gallery_channels_uls[i].className = ( i == clickedCategoryPos ) ? "current" : "";
    }
    // highlight first index of clicked category
    if ( gallery_channels_uls[clickedCategoryPos] ) gallery_channels_uls[clickedCategoryPos].getElementsByTagName('li')[0].onclick();
}

/**
* onClick function when an index is clicked on product center page
* @param currentElement li element that triggers the onclick event
* @param contentId the content to display
* @param linkCategoryId link category id
*/
function galleryChannelOnClick(currentElement, contentId, linkCategoryId) {
    var gallery_channels_lis = document.getElementById('adsk101-gallery_channels').getElementsByTagName('li');
    for(i=0;i<gallery_channels_lis.length;i++) {
        gallery_channels_lis[i].className = (gallery_channels_lis[i] == currentElement ) ? "current" : "";
    }

    loadTv(contentId, linkCategoryId);
}

/**
* Load content into TV section
* @param contentId the content to display
* @param linkCategoryId link category id
*/
function loadTv(contentId, linkCategoryId) {

    function onSuccess( request ) {
        if( request.status != 200 ) {
            return;
        }
        tvElement.innerHTML  = loadingImgHideHTML + request.responseText;
    }

    function onFailure( request, obj ) {
        tvElement.innerHTML  = loadingImgHideHTML + "Page not found";
    }

    var tvElement = document.getElementById('adsk101-tv');
    if (! tvElement )
        return;

    var url = getTVUrl(contentId, linkCategoryId);
    var params = "";
    if ( url != null ) {
        var aUrl = url.split("?");
        if ( aUrl.length == 2 ) {
            url = aUrl[0];
            if ( ! core_isStringBlank(aUrl[1]) )
            params = aUrl[1];
        }
    }

    var loadingImgShowHTML = "";
    var loadingImgHideHTML = "";
    var loadingImg = document.getElementById('adsk91-loading-img');

    if ( loadingImg ) {
        var prevHeight = tvElement.offsetHeight - loadingImg.height * 2;
        var loadingImgHTML = '<img src="' + loadingImg.src + '" id="' + loadingImg.id + '"/>';
        loadingImgShowHTML = '<p class="loading" style="height:' + prevHeight + 'px">' + loadingImgHTML + '</p>';
        loadingImgHideHTML = '<p class="loading off">' + loadingImgHTML + '</p>';
    }
    tvElement.innerHTML = loadingImgShowHTML;
    new Ajax.Request(
        url,
        {
            method: 'get',
            parameters: params,
            onComplete: onSuccess,
            onFailure: onFailure,
            onException: onException
        }
    );
}

/**
 * Open/Close an accordion.
 * @param currentElement element that triggers the event
 */
function accordionToggle(currentElement) {
    currentElement.className = ( currentElement.className == "open" ) ? "" : "open";
    var nextElement = currentElement.nextSibling;
    while (nextElement.nodeType != 1)
    {
        nextElement = nextElement.nextSibling;
    }
    // set the speed of opening speed : closing speed
    var speed = ( currentElement.className == "open" ) ? 300 : 300;
    cda_animateElement( nextElement, "slideToggle", speed );
 }



/**
 * This function is used for open accordion when hover.
 * @param currentElement element that triggers the event
 */
var lastMouseOver;
function accordionOpenSingleHover(currentElement) {
	lastMouseOver = currentElement;
	setTimeout ( function() {if (lastMouseOver != currentElement) return; accordionOpenSingle(currentElement, true);}, 300 );
}

/**
 * If selected Item is open, clicking on / mouseover it does not close it.
 * If selected Item is closed, open the selected Item and close any previously opened Item.
 * @param currentElement element that triggers the event
 * @param isFixedHeight whether the accordion is a fixed height accordion
 */
var accordionInProcess = false; // ensure only one accordion is in animation at any given time
function accordionOpenSingle(toShowHeader, isFixedHeight) {
    // if selected item is open, clicking on it doesn't open it
    if ( toShowHeader.className == "open" || toShowHeader.className == "open hover" )
    	return;

    if (accordionInProcess) return;

    var parentElement = toShowHeader.parentNode;
    var accordionH3s = parentElement.getElementsByTagName('h3');
    var toHideHeader;
    for(i=0;i<accordionH3s.length;i++) {
    	if ( accordionH3s[i].className == "open" || accordionH3s[i].className == "open hover") {
    	    toHideHeader = accordionH3s[i];
    	}
    }

    var autoHeight = ( isFixedHeight ) ? true : false;
    accordionInProcess = true;
    var options = { autoHeight: autoHeight, complete: accordionOnComplete(toShowHeader, toHideHeader) };
    cda_animateAccordion(toShowHeader, toHideHeader, options);
    //accordionToggle(toShowHeader);
    //if (toHideHeader) accordionToggle(toHideHeader);
}

/**
* oncomplete function for accordion
* @param toShowHeader header whose section will be shown
* @param toHideHeader header whose section will be closed
*/
function accordionOnComplete(toShowHeader, toHideHeader) {
	toShowHeader.className = "open";
	if (toHideHeader) toHideHeader.className = "";
	accordionInProcess = false;
}

/**
 * All IE6 fixes.
**/

function ie6Fixes() {
    if(!isIE6) return;

    pcCenterNavIE6Fix();
    accordionHoverIE6Fix();
    remoteTVHoverIE6Fix();
}

/**
 * Attach class names for product center navigation for IE6. Use conditional compilation to detect IE6
**/

function pcCenterNavIE6Fix() {
    var mainNavElement = document.getElementById('adsk91-main-nav');
    if (!mainNavElement)
    	return;

    var main_nav_lis = mainNavElement.getElementsByTagName('li');
    if (!main_nav_lis) return;

    var currentPosition = -1;
    for(i=0;i<main_nav_lis.length;i++) {
	if (main_nav_lis[i].className == "menu current") {
            currentPosition = i;
            break;
        }
    }
    if (currentPosition >= 0) {
        main_nav_lis[currentPosition].className = (currentPosition == 0) ? "menu current menu_current menu_current_first" : "menu current menu_current";
        var nextElement = main_nav_lis[currentPosition].nextSibling;
        while (nextElement && nextElement.nodeType != 1) {
                nextElement = nextElement.nextSibling;
        }
        if (nextElement) nextElement.className = (currentPosition == 0) ? "menu menu_next menu_next_first" : "menu menu_next";
    }

    if ( mainNavElement.getElementsByTagName('ul').length > 0) mainNavElement.getElementsByTagName('ul')[0].style.visibility = "visible";
}

/**
 * Attach class names for product center navigation for IE6.
**/

function accordionHoverIE6Fix() {
    var accordionDivs = getElementsByClassName(document, "div", "accordion");
    if (!accordionDivs) return;

    for(i=0;i<accordionDivs.length;i++) {
    	var h3s = accordionDivs[i].getElementsByTagName('h3');
	for (j=0;j<h3s.length;j++) {
		if (h3s[j].onmouseover) {//promotion accordion
			h3s[j].onmouseover = function () { accordionOpenSingleHover(this); accordionHoverIE6(this) };
		} else {
			h3s[j].onmouseover = function () { accordionHoverIE6(this) };
		}
		h3s[j].onmouseout = function () { accordionHoverOutIE6(this) };
	}
    }
}

/**
* Add hover class to the attached element
**/
function accordionHoverIE6(currentElement) {
    currentClassName = currentElement.className;
    if ( !currentClassName || currentClassName.indexOf('hover') < 0 ) {
        currentElement.className = (!currentClassName) ? "hover" : currentClassName + " hover";
    }
}

/**
* Remove hover class to the attached element
**/
function accordionHoverOutIE6(currentElement) {
    currentClassName = currentElement.className;
    if ( currentClassName.indexOf('hover') >= 0 ) {
        currentElement.className = currentClassName.substring(0, ( currentClassName.indexOf( 'hover' ) - 1) )
    }
}

/* Add or remove hover class for categories or channels in IE6 */
function remoteTVHoverIE6Fix() {
    if (!document.getElementById('adsk101-gallery_navigation'))
        return;

    var gallery_navigation_lis = document.getElementById('adsk101-gallery_navigation').getElementsByTagName('li');
    if (gallery_navigation_lis) {
        for(i=0;i<gallery_navigation_lis.length;i++) {
            gallery_navigation_lis[i].onmouseover = function() { this.className = ( this.className.indexOf('current') >= 0 ) ? "current hover" : "hover"; };
            gallery_navigation_lis[i].onmouseout = function() { this.className = (this.className.indexOf('current') >= 0 ) ? "current" : ""; };
        }
    }

    var gallery_channels_lis = document.getElementById('adsk101-gallery_channels').getElementsByTagName('li');
    if (gallery_channels_lis) {
        for(i=0;i<gallery_channels_lis.length;i++) {
            gallery_channels_lis[i].onmouseover = function() { this.className = ( this.className.indexOf('current') >= 0 ) ? "current hover" : "hover"; };
            gallery_channels_lis[i].onmouseout = function() { this.className = ( this.className.indexOf('current') >= 0 ) ? "current" : ""; };

        }
    }
}

/**
 * Get elements by class name(s)
 * @param node the starting node
 * @param tag tag name
 * @param className class names seperated by space
 */

function getElementsByClassName(node, tag, className) {
    if (node.getElementsByClassName)
        return node.getElementsByClassName(className);
    else {
        tag = tag || "*";
        node = node || document;
        var classes = className.split(" "),
            classesToCheck = [],
            elements = (tag === "*" && node.all)? node.all : node.getElementsByTagName(tag),
            current,
            returnElements = [],
            match;
        for(var k=0, kl=classes.length; k<kl; k+=1){
            classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
        }
        for(var l=0, ll=elements.length; l<ll; l+=1){
            current = elements[l];
            match = false;
            for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
                match = classesToCheck[m].test(current.className);
                if (!match) {
                    break;
                }
            }
            if (match) {
                returnElements.push(current);
            }
        }
        return returnElements;
    }
}

