				expressAddProduct = function(productID) {
					GB_ONLY_ONE.setOverlayCloseClick(false);
					GB_ONLY_ONE.setOverlayColor('dark');
					document.location.href = '/admin/?page=AddMultiProduct&window=shop-popup&context-shopID='+shopID+'&p='+productID;
          //return GB_show('Zlio.com','/admin/?page=AddMultiProduct&window=shop-popup&context-shopID='+shopID+'&p='+productID,520,780); 
				}
				
				function visitMerchant(merchantID,shopID, trackingUrl, framed) {
				  framed = (framed==1)?'yes':'no'
					var url = BASE_URL + 'tracking?m='+ merchantID + '&z='+ shopID + '&framed=' + framed;
					try {
						urchinTracker('/shop/offer-service');
					} catch(ex) {
						// library was broken
					}
					window.open(url, '_blank', '');
				}
				
				function visitCpcOffer(productID, shopID, merchantID, merchantUrl, trackingUrl, framed) {
				  framed = (framed==true)?'yes':'no'
					var url = BASE_URL + 'tracking?productID='+ productID + '&m=' + merchantID + '&z='+ shopID + '&u='+ merchantUrl + '&framed=' + framed;
					try {
						urchinTracker('/shop/offer-cpc');
					} catch(ex) {
						// library was broken
					}
					window.open(url, '_blank', '');
				}
				
				loadSimilarProducts = function(productID) {
					var params = 'productID=' + productID + '&maxResults=3&output=json&authUserID=17&authToken=MGM4YzY0NTIxYjE0OTY5MWUzYTZlOWE0ZTY5ZTI4MmQ%3D';
					var url = BASE_URL + 'rest/?method=GetSimilarProductList' ;
									
					$j('#indicator').show();
					$j.get( 
        		url,  
        		{productID:productID,maxResults:3, output:"json",authUserID:"17",authToken:"MGM4YzY0NTIxYjE0OTY5MWUzYTZlOWE0ZTY5ZTI4MmQ="},
        		 function(data){$j('#indicator').hide();loadSimilarProductsCallback(data);}
        	 );
				}
				
				
				
				function loadCommentsCallback(jsontext) {
				  
					var comments = eval( '(' + jsontext + ')' );	
					if (comments.length==0) {
						$j('#newcomment-first').show();
						$j("#best_offer_duplicate").hide();
						
						//display new comment form
						if(!have_owner_comment)
						{
							$j("#newcomment").show();
							$j(".comment_new").hide();
							$j("#have_comments").hide();
							$j("#no_comments").show();
						}
						else
						{
							$j("#newcomment").hide();
							$j(".comment_new").show();
							if(best_offer_displayed)$j("#best_offer_duplicate").show();
							//the store keeper comment sound as 1 comment.
    					$j("#nbComments").html("1");
    					$j("#have_comments").show();
    					$j("#no_comments").hide();

						}
							return true;
					}
						
					html='';
					
					 if(best_offer_displayed)$j("#best_offer_duplicate").show();
					 $j("#nbComments").html(comments.length);
					 $j("#have_comments").show();
					 $j("#no_comments").hide();

					for(var i=0; i < comments.length; i++) {	
					  mycomment = comments[i];
					  author = (mycomment.authorName) ? mycomment.authorName : mycomment.authorDisplayName;
						author = (author) ? author : 'Guest';
						
  					html+='<div class="comment_item">';
    					html+='<div class="comment_user">';
    						html+='<div class="comment_info">';
    							html+='<div class="big">'+author+'</div>';
    							/*html+='<div class="star_5"><div>&nbsp;</div></div>';*/
    							html+='<div>- ' + mycomment.creationDate_RFC822 + '</div>';
    							html+='<span class="clearer">&nbsp;</span>';
    						html+='</div>';
    						html+='<div class="comment_content">';
    							html+=mycomment.comment;
    						html+='</div>	';
    					html+='</div>	';
  					/*
  					feebacks not yet implemented
  					<div class="comment_feedback">
  						<div>Is this comment usefull?</div>
  						<div class="pourcent_up">66%</div>
  						<div><a href="#" title="vote yes">vote yes</a></div>
  						<div class="pourcent_down">66%</div>
  						<div><a href="#" title="vote no">vote no</a></div>
  						<div>(21 votes)</div>
  						<span class="clearer">&nbsp;</span>
  					</div>
  					<div class="clearer"></div>
  					*/
  				  html+='</div>';
					}
					$j('#comment-list').html(html);
				}
				
				function sendCommentCallback(jsontext) {
					var result = eval( '(' + jsontext + ')' );	
					$j('#newcomment-indicator').hide();
					if (result) {
						$j('#newcomment-form').hide();
						$j('#newcomment-success').show();
					}
				}

				
				showNewComment = function () {
				  $j('#productDetails').tabs(2);
				  $j('.comment_new').hide();
				  $j('#newcomment').show();
				}

				/* display compare box */
        function viewCompareBox(box)
        {
          if(!box)
            box="compareLeight";
          showBG();
					//$j("#compareLeightB").html($j("#"+box).html());
					//$j("#compareLeightB").show();
          $j("#"+box).show();         
					$j("html").css("overflow-y","hidden");          
        }
				
						
				function displayOff(id){					
					$j("#"+id).hide();					
					$j("#overlayB").hide();
					$j("html").css("overflow-y","auto");
				}
				
				function showBG(){				  
				  if($j('#overlayB').get()=="")
					 $j('body').append("<div id='overlayB'></div>");
					$j('#overlayB').show();
				}
				
				
				/****** sortable.js ******/
        
        var SORT_COLUMN_INDEX;
        
        function sortables_init() {
          $j("table.sortable").each(function(){ts_makeSortable(this);});
        }
        
        function ts_makeSortable(table) {
            if (table.rows && table.rows.length > 0) {
                var firstRow = table.rows[0];
            }
            if (!firstRow) return;
            
            // We have a first row: assume it's the header, and make its contents clickable links
            for (var i=0;i<firstRow.cells.length;i++) {
                var cell = firstRow.cells[i];
                var txt = ts_getInnerText(cell);
                cell.innerHTML = '<a href="#" class="sortheader" onclick="ts_resortTable(this);return false;">'+txt+'<span class="sortarrow">&nbsp;&nbsp;&nbsp;</span></a>';
            }
        }
        
        function ts_getInnerText(el) {
        	if (typeof el == "string") return el;
        	if (typeof el == "undefined") { return el };
        	if (el.innerText) return el.innerText;	//Not needed but it is faster
        	var str = "";
        	
        	var cs = el.childNodes;
        	var l = cs.length;
        	for (var i = 0; i < l; i++) {
        		switch (cs[i].nodeType) {
        			case 1: //ELEMENT_NODE
        				str += ts_getInnerText(cs[i]);
        				break;
        			case 3:	//TEXT_NODE
        				str += cs[i].nodeValue;
        				break;
        		}
        	}
        	return str;
        }
        
        function ts_resortTable(lnk) {
            // get the span
            var span;
            for (var ci=0;ci<lnk.childNodes.length;ci++) {
                if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span') span = lnk.childNodes[ci];
            }
            var spantext = ts_getInnerText(span);
            var td = lnk.parentNode;
            var column = td.cellIndex;
            var table = getParent(td,'TABLE');
            
            // Work out a type for the column
            if (table.rows.length <= 1) return;
            var itm = ts_getInnerText(table.rows[1].cells[column]);
            sortfn = ts_sort_caseinsensitive;
            if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d\d\d$/)) sortfn = ts_sort_date;
            if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d$/)) sortfn = ts_sort_date;
            if (itm.match(/^[?$?]/)) sortfn = ts_sort_currency;
            if (itm.match(/^[\d\.]+$/)) sortfn = ts_sort_numeric;
            // hack DLY 04/09/2006 17:18 : force the sort type ( can not detect euros )
            sortfn = ts_sort_currency
            SORT_COLUMN_INDEX = column;
            var firstRow = new Array();
            var newRows = new Array();
            for (i=0;i<table.rows[0].length;i++) { firstRow[i] = table.rows[0][i]; }
            for (j=1;j<table.rows.length;j++) { newRows[j-1] = table.rows[j]; }
        
            newRows.sort(sortfn);
        
            if (span.getAttribute("sortdir") == 'down') {
                ARROW = '&nbsp;&nbsp;&uarr;';
                newRows.reverse();
                span.setAttribute('sortdir','up');
            } else {
                ARROW = '&nbsp;&nbsp;&darr;';
                span.setAttribute('sortdir','down');
            }
            
            // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones
            // don't do sortbottom rows
            for (i=0;i<newRows.length;i++) { if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) table.tBodies[0].appendChild(newRows[i]);}
            // do sortbottom rows only
            for (i=0;i<newRows.length;i++) { if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1)) table.tBodies[0].appendChild(newRows[i]);}
            
            // Delete any other arrows there may be showing
            var allspans = document.getElementsByTagName("span");
            for (var ci=0;ci<allspans.length;ci++) {
                if (allspans[ci].className == 'sortarrow') {
                    if (getParent(allspans[ci],"table") == getParent(lnk,"table")) { // in the same table as us?
                        allspans[ci].innerHTML = '&nbsp;&nbsp;&nbsp;';
                    }
                }
            }
            // hack DLY : highlight the first row after sort 12/09/2006 00:33
           	table.rows[1].className = 'offer-on first';
            span.innerHTML = ARROW;
        }
        
        function getParent(el, pTagName) {
        	if (el == null) return null;
        	else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())	// Gecko bug, supposed to be uppercase
        		return el;
        	else
        		return getParent(el.parentNode, pTagName);
        }
        function ts_sort_date(a,b) {
            // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
            aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
            bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
            if (aa.length == 10) {
                dt1 = aa.substr(6,4)+aa.substr(3,2)+aa.substr(0,2);
            } else {
                yr = aa.substr(6,2);
                if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
                dt1 = yr+aa.substr(3,2)+aa.substr(0,2);
            }
            if (bb.length == 10) {
                dt2 = bb.substr(6,4)+bb.substr(3,2)+bb.substr(0,2);
            } else {
                yr = bb.substr(6,2);
                if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
                dt2 = yr+bb.substr(3,2)+bb.substr(0,2);
            }
            if (dt1==dt2) return 0;
            if (dt1<dt2) return -1;
            return 1;
        }
        
        function ts_sort_currency(a,b) { 
            aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
            bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
            // HACK DLY for N.C. values transformed in .. which are not valid numeric values 12/09/2006 01:15
            if (aa=='..') aa = '1000000';
            if (bb=='..') bb = '1000000';
            return parseFloat(aa) - parseFloat(bb);
        }
        
        function ts_sort_numeric(a,b) { 
            aa = parseFloat(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));
            if (isNaN(aa)) aa = 0;
            bb = parseFloat(ts_getInnerText(b.cells[SORT_COLUMN_INDEX])); 
            if (isNaN(bb)) bb = 0;
            return aa-bb;
        }
        
        function ts_sort_caseinsensitive(a,b) {
            aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
            bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
            if (aa==bb) return 0;
            if (aa<bb) return -1;
            return 1;
        }
        
        function ts_sort_default(a,b) {
            aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
            bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
            if (aa==bb) return 0;
            if (aa<bb) return -1;
            return 1;
        }
				
				
