/*
 * Title  : fvReVolusion (Volusion plugin for Power Reviews)
 * Author : Kwi Hyun Choi <masterpc@gmail.com>
 * Version: 0.9
 *
 * Last Released: 8/1/2009
 *
 * fvReVolusion is copyright(c) 2009 Kwi Hyun Choi. Lincesed under the BSD License
 * -------------------------------------------------------------------------------
 * CONFIG:
 *   MERCHANT_ID         - Unique number from Power Reviews (found in URL)
 *   MERCHANT_CSS        - URL for css from Power Reviews (found in URL)
 *   CATEGORY_NO_WRITE   - Volusion category number for review writing form
 *   SNIPPET_MIN_REVIEWS - Minimum number of reviews to display snippet.
 *                         Applied to only category pages.
 *
 * INSTALL:
 *   <script type="text/javascript">
 *     if( typeof Prototype == 'undefined' )
 *       document.write( '<scr'+'ipt type="text/javascript" src="/v/revolusion/prototype-1603-masterpc.js'+'"></scr'+'ipt>' );
 *   </script>
 *   <script type="text/javascript" src="/v/revolusion/fvRevolusion.js"></script>
 *   <script type="text/javascript">
 *     fvSettings.REVOLUSION_PATH='/v/revolusion';
 *     fvSettings.MERCHANT_ID='12345';
 *     fvSettings.MERCHANT_CSS='http://cdn.powerreviews.com/aux/------/css/powerreviews_express.css';
 *     fvSettings.CATEGORY_NO_WRITE='123';
 *     fvRevolusion.main();
 *   </script>
 *------------------------------------------------------------------------------*/

/*
 * CONFIGURATION
 *------------------------------------------------------------------------------*/
var fvSettings = {
	'MERCHANT_ID'        : null,
	'MERCHANT_CSS'       : null,
	'CATEGORY_NO_WRITE'  : null,
	'SNIPPET_MIN_REVIEWS': 1,
	'DEBUG'              : false,			// true, false
	'DEBUG_TARGET'       : 'I',				// 'P', 'S', 'I'
	'DEBUG_PRODUCT_CODE' : '------'			// Product #
};


/*
 * SOURCE - DO NOT MODIFY IF YOU DO NOT KNOW WHAT YOU ARE DOING
 *------------------------------------------------------------------------------*/
var BasicWriter = Class.create({
	_id : null,
	_className : null,
	_elm : null,
	_foundElm : null,
	_style : '',

	initialize:function( id )
	{
		this._id = id;

		this.createElement();
	},
	initialize:function( id, pc, elm )
	{
		this._id = id + '_' + pc;
		this._className = id;
		this._foundElm = elm;

		this.createElement();
	},
	insertDiv:function( elm ) {},
	createElement:function()
	{
		if( this._className == null )
			this._elm = new Element( 'div', { id:this._id, className:this._id, style:this._style } );
		else
			this._elm = new Element( 'div', { id:this._id, className:this._className, style:this._style } );

		this.insertDiv( this._elm );
	},
	write:function( html )
	{
		this._elm.insert( html );
	},
	getElementById:function( id ){ return document.getElementById( id ); }
});

var SnippetWriter = Class.create( BasicWriter, {
	_style : 'width:180px;',

	insertDiv:function( elm )
	{
		var targetElm = $( "product_photo_zoom_url" );
		if(targetElm == null)
			return;

		targetElm.insert( { after: elm } );
	}
});

var ReviewWriter = Class.create( BasicWriter, {
	insertDiv:function( elm )
	{
		/*
		var tables = document.getElementsByClassName( 'colors_descriptionbox' );
		if( tables == null || tables.length <= 0 )
			return;

		var reviewTable = tables[0];
		var targetElm = Element.extend( reviewTable.rows[1].cells[1] );
		if(targetElm == null)
			return;

		targetElm.update( elm );
		*/
		jQuery( elm ).appendTo( jQuery( "#ProductDetail_ExtInfo_div" ) );
	}
});

var CategorySnippetWriter = Class.create( BasicWriter, {
	insertDiv:function( elm )
	{
		if(this._foundElm == null)
			return;

		var targetElm = this._foundElm.up();
		if(targetElm == null)
			return;

		targetElm.insert( { top: elm } );
	}
});

var IndexSnippetWriter = Class.create( BasicWriter, {
	insertDiv:function( elm )
	{
		if(this._foundElm == null)
			return;

		var targetElm = this._foundElm.up();
		if(targetElm == null)
			return;

		targetElm = targetElm.up();
		if(targetElm == null)
			return;

		targetElm.insert( { bottom: elm } );
	}
});


var fvRevolusion = {
	_url : window.location.href.toLowerCase(),
	_pageType : null,

	parsePageType:function()
	{
		if( this._url.indexOf( '/productdetails.asp' ) != -1 || this._url.lastIndexOf( '-p/' ) != -1 || this._url.lastIndexOf( '_p/' ) != -1 )
		{
			this._pageType = 'P';
		}
		else if( this._url.indexOf( '/searchresults.asp' ) != -1 || this._url.lastIndexOf( '-s/' ) != -1 || this._url.lastIndexOf( '_s/' ) != -1 )
		{
			this._pageType = 'S';
		}
		else if( location.pathname == '/' ||location.pathname.toLowerCase().indexOf( '/default.asp' ) != -1 )
		{
			this._pageType = 'I';
		}
	},

	getProductCode:function( url )
	{
		if( fvSettings.DEBUG == true )
			return fvSettings.DEBUG_PRODUCT_CODE;

		url = url.toLowerCase();

		var productCode = "";
		var xparams = "";
		if( url.indexOf( '?' ) != -1 )
			xparams = url.substr( url.indexOf( '?' )+1 );

		if( url.indexOf( "/productdetails.asp" ) != -1 )
		{
			var params = xparams.split("&");

			for (var i=0; i<params.length; i++)
			{
				var values = params[i].split("=");

				if (values[0] == "productcode")
				{
					productCode = unescape( values[1] );

					break;
				}
			}
		}
		else if( url.indexOf("-p/") != -1 || url.indexOf("_p/") != -1 )
		{
			var pos = url.lastIndexOf( "/" ) + 1;
			var workStr = url.substr( pos );

			productCode = unescape( workStr.substr( 0, workStr.lastIndexOf( "." ) ) );
		}

		return productCode.toUpperCase();
	},

	displayOnProduct:function()
	{
		var productCode = fvRevolusion.getProductCode( fvRevolusion._url );
		if( productCode.length <= 0 )
			return;

		var snippet = new SnippetWriter( 'pr_snippet_product' );
		var pr_write_review = '/SearchResults.asp?Cat=' + fvSettings.CATEGORY_NO_WRITE + '&pr_page_id=' + productCode;
		var pr_read_review = '/ProductDetails.asp?ProductCode=' + productCode + '&Show=ExtInfo';

		POWERREVIEWS.display.snippet( snippet, { pr_page_id:productCode, pr_read_review:pr_read_review, pr_write_review:pr_write_review } );


		var reviewsum = new ReviewWriter( 'pr_review_summary' );

		POWERREVIEWS.display.engine( reviewsum, { pr_page_id:productCode, pr_read_review:pr_read_review, pr_write_review:pr_write_review } );

		if( fvRevolusion._url.lastIndexOf( 'show=extinfo' ) != -1 )
		{
			jQuery( "#ProductDetail_ProductDetails_div" ).hide();
			jQuery( "#ProductDetail_ExtInfo_div" ).show();
		}
	},

	displayOnCategory:function()
	{
		var mainFrm = $( 'MainForm' );
		if( mainFrm == null )
			return;

		var urls = mainFrm.select( 'a' );
		var targets = mainFrm.getElementsByClassName( 'smalltext colors_text' );
		var currIdx = 0;

		for( var i=0; i<urls.length; i++ )
		{
			var productCode = fvRevolusion.getProductCode( urls[i].href );
			if( productCode.length <= 0 )
				continue;

			var imgs = urls[i].select( 'img' );
			if( imgs == null || imgs.length <= 0 )
				continue;

			if( imgs[0].src.indexOf( 'Bullet_MoreInfo.gif' ) != -1 )
				continue;

			var snippet = new CategorySnippetWriter( 'pr_snippet_category', productCode, targets[currIdx++] );

			POWERREVIEWS.display.snippet( snippet, { pr_page_id:productCode, pr_snippet_min_reviews:fvSettings.SNIPPET_MIN_REVIEWS } );
		}
	},

	displayOnIndex:function()
	{
		var contentArea = $( 'content_area' );
		var urls = contentArea.select( 'a.smalltext' );
		var targets = contentArea.getElementsByClassName( 'pricecolor colors_productprice' );
		var currIdx = 0;

		for( var i=0; i<urls.length; i++ )
		{
			var productCode = fvRevolusion.getProductCode( urls[i].href );
			if( productCode.length <= 0 )
				continue;

			var imgs = urls[i].select( 'img' );
			if( imgs == null || imgs.length <= 0 )
				continue;

			if( imgs[0].src.indexOf( 'Bullet_MoreInfo.gif' ) == -1 )
				continue;

			var snippet = new IndexSnippetWriter( 'pr_snippet_category', productCode, targets[currIdx++] );

			POWERREVIEWS.display.snippet( snippet, { pr_page_id:productCode, pr_snippet_min_reviews:fvSettings.SNIPPET_MIN_REVIEWS } );
		}
	},

	main:function()
	{
		if( fvSettings.MERCHANT_ID == null || fvSettings.MERCHANT_ID.length <= 0 )
			return;
		if( fvSettings.MERCHANT_CSS == null || fvSettings.MERCHANT_CSS.length <= 0 )
			return;
		if( fvSettings.CATEGORY_NO_WRITE == null || fvSettings.CATEGORY_NO_WRITE.length <= 0 )
			return;

		this.parsePageType();
		if( fvSettings.DEBUG == true )
			this._pageType = fvSettings.DEBUG_TARGET;

		if( this._pageType )
		{
			document.write( '<scr'+'ipt type="text/javascript" src="http://cdn.powerreviews.com/repos/' + fvSettings.MERCHANT_ID + '/pr/pwr/engine/js/full.js'+'"></scr'+'ipt>' );
			document.write( '<link id="prBaseStylesheet" type="text/css" rel="stylesheet" href="'+'http://cdn.powerreviews.com/repos/' + fvSettings.MERCHANT_ID + '/pr/pwr/engine/pr_styles_review.css" />');
			document.write( '<link id="prMerchantOverrideStylesheet" type="text/css" rel="stylesheet" href="' + fvSettings.MERCHANT_CSS + '" />');

			if( window.addEventListener )
			{
				if( this._pageType == 'P' )
					window.addEventListener( "load", fvRevolusion.displayOnProduct, false );
				else if( this._pageType == 'S' )
					window.addEventListener( "load", fvRevolusion.displayOnCategory, false );
				else if( this._pageType == 'I' )
					window.addEventListener( "load", fvRevolusion.displayOnIndex, false );
			}
			else if( window.attachEvent )
			{
				if( this._pageType == 'P' )
					window.attachEvent( "onload", fvRevolusion.displayOnProduct );
				else if( this._pageType == 'S' )
					window.attachEvent( "onload", fvRevolusion.displayOnCategory );
				else if( this._pageType == 'I' )
					window.attachEvent( "onload", fvRevolusion.displayOnIndex );
			}

		}
	}
}

