/**
 * Gravity options
 *
 */
GravityOptions = Object.extend({
	ajaxUrl: {
		gravity: '/gravity/'
		},
	ajaxLoadingImg: '/img/ajax_indicator.gif',
	elements: {},
	messages: {},
	resultNames: ["itemid", "title", "ImageThumbUrl", "Url", "UnitPrice", "Lead"]
});

/**
 * Gravity class
 *
 */
var Gravity = Class.create({
	/**
	 * Instance properties
	 */
    lastRecommendationId: null,
    lastRecommendedProducts: [],

	/**
	 * Methods
	 *
	 * Class constructor
	 */
	initialize: function()
    {
		this.ajaxUrl = GravityOptions.ajaxUrl;
		//this.ajaxLoadingImg = Builder.node('img', {'src': GravityOptions.ajaxLoadingImg, 'alt': '', 'class': 'basketAjaxLoadingImg'});
		this.elements = GravityOptions.elements;
		this.resultNames = GravityOptions.resultNames;
        GravityRD.setUseJsGeneratedCookie(true);
	},

    sendRequest: function(params, onSuccess, onError)
    {
        new Ajax.Request(
            this.ajaxUrl.gravity,
            {
                method: 'POST',
                parameters: params,
                onCreate: (
                    function() {
                        //this.favoriteProcess = true;
                    }).bind(this),
                onComplete: (
                    function(response) {
                        var data = response.responseText.evalJSON(true);
                        if (!data.error || !onError) {
                            onSuccess();
                            //Console.log("Gravity: sikerült!");
                        } else {
                            onError();
                            //Console.log("Gravity: hiba!!!");
                        }
                    }).bind(this)
                //onFailure: (this.handleAjaxFailure).bind(this)
            });
    },

    getRecommendation: function(targetElement, params)
    {
        if (typeof(targetElement) == 'object' && typeof(params) == 'object') {
            new Ajax.Request(
                this.ajaxUrl.gravity,
                {
                    method: 'POST',
                    parameters: params,
                    onCreate: (function(){}).bind(this),
                    onComplete: (
                        function(response) {
                            var data = response.responseText.evalJSON(true);
                            var html = data.message;
                            
                            if (html != '') {
                                $(targetElement).update(html);
                            } else {
                                //Console.log("Gravity: hiba!" + this.ajaxResult.debugInfo);
                            }
                        }).bind(this)
                    /*onFailure: (this.handleAjaxFailure).bind(this)*/
                });
        }
    },
    
    getRecommendationByJS: function(params) {
		
		// setting global parameters
		GravityRD.setUserID(getCookie('mid'));
		GravityRD.setMerchantId("rdshop");
		//GravityRD.setCookieID(getCookie('PHPSESSID'));
		
		this.container = $(params.target);
		this.template = $(params.template);
		
		var nameValues = new Array();
		for (i=0;i < params.itemOnPage.length;i++) {
			nameValues.push({name: 'ItemOnPage', value: params.itemOnPage[i]});
		}
		for (i=0;i < params.itemInCart.length;i++) {
			nameValues.push({name: 'CartItemId', value: params.itemInCart[i]});
		}
		for (i=0;i < params.quantityInCart.length;i++) {
			nameValues.push({name: 'CartItemQuantity', value: params.quantityInCart[i]});
		}
		if (params.currentItemId > 0) {
			nameValues.push({name: 'CurrentItemId', value: params.currentItemId});
		}
		if (params.categoryId > 0) {
			nameValues.push({name: 'CategoryId', value: params.categoryId});
		}
		 
		// initializing the recommendation request
		GravityRD.recommendationRequest({
			requestParams: {
				scenarioId: params.scenarioId,
				numberLimit: params.numberLimit,
				nameValues: nameValues
			},
			resultNames: this.resultNames,
			callback: this.recoCallback.bind(this)
		});
		GravityRD.commit();
    },
    
    recoCallback: function(result) {
    	var tmp_cont = new Element('div');
    	var items = result.items;
    	var template = this.template.innerHTML;
    	//console.log(template);
    	for (i=0; i < items.length; i++) {
    		var tpl = template;
    		for (ii=0; ii < this.resultNames.length; ii++) {
    			var key = this.resultNames[ii];
				if (key=='ImageThumbUrl') {
					var ptrn = new RegExp('___'+key+'___', 'g');
					tpl = tpl.replace(ptrn, '<img width'+'='+'90 src'+'=\"'+items[i][key]+'\" alt'+'=\"'+items[i]['title']+'\"'+'/>');
				} else {
					var ptrn = new RegExp('___'+key+'___', 'g');
					tpl = tpl.replace(ptrn, items[i][key]);
				}

    		}
    		tpl = tpl.replace(/___recommendationId___/g, result.recommendationId);
   			tpl = tpl.replace(/___pos___/g, i);
    		//console.log(tpl);
    		tmp_cont.update(tpl);
    		this.container.appendChild(tmp_cont.down());
    	}
    },
    
    addEvent: function(params) {
    	GravityRD.setUserID(getCookie('mid'));
		// the unique cookie id which should be the same for one specific user all the time
		//GravityRD.setCookieID(getCookie('PHPSESSID'));
		GravityRD.setMerchantId("rdshop");
		
		var nameValues = [];
		if (parseInt(params.quantity) > 0) {
			nameValues.push({ name: "Quantity", value: params.quantity});
		}
		if (parseInt(params.position) > 0) {
			nameValues.push({ name: "Position", value: params.position});
		}
		
		if (params.rateValue > 0) {
			nameValues.push({name: 'Value', value: params.rateValue});
		}
		
		var recommendationId = null;
		if (typeof(params.recommendationId) != 'undefined' && params.recommendationId != '') {
			recommendationId = params.recommendationId;
		}
		
		GravityRD.addEvent({
			eventType: params.eventType,
			itemId: params.itemId,
			nameValues: nameValues,
			recommendationId: recommendationId
		});
		
    },
    
    commit: function() {
    	GravityRD.commit();
    },
    
    recoClicked: function(params) {
    	//console.log(this);
		this.addEvent({
    		eventType: 'REC_CLICK',
    		itemId: params.itemId,
    		position: params.position,
    		recommendationId: params.recoId
    	});
    	this.commit();
    	//window.location = params.url;
    	return false;
    }

});

/**
 * Static methods and properties
 */
Gravity.instance = null;

Gravity.getInstance = function()
{
    if (this.instance instanceof this)
    {
        return this.instance;
    }
    else
    {
        this.instance = new this();
    }
    return this.instance;
}

Gravity.sendItemView = function(id, recommendationId)
{
    try
    {
        if (id && !isNaN(parseInt(id)))
        {
            var params = {
                action: 'ItemView',
                productId: parseInt(id),
                recommendationId: recommendationId
                };
            this.getInstance().sendRequest(params);
        }
    }
    catch (e)
    {
        //Console.log(e);
    }
}

Gravity.sendAddToBasket = function(id,gravityRecommendationId)
{
    try
    {
        if (id > 0)
        {
            var params = {
                action: 'AddToBasket',
				gravityRecommendationId: gravityRecommendationId,
                productId: id
                };
            this.getInstance().sendRequest(params);
        }
    }
    catch (e)
    {
        //Console.log(e);
    }
}

Gravity.sendAddToSavedCart = function(id, cartId)
{
    try
    {
        if (id > 0)
        {
            var params = {
                action: 'AddToSavedCart',
                productId: id,
				cartId: cartId
                };
            this.getInstance().sendRequest(params);
        }
    }
    catch (e)
    {
       //Console.log(e);
    }
}

Gravity.sendAddToFavorites = function(id)
{
    try
    {
        if (id)
        {
            //Console.log(typeof(ids));
            //Console.log(ids);

            var params = {
                action: 'AddToFavorites',
                productId: id
                };
            this.getInstance().sendRequest(params);
        }
    }
    catch (e)
    {
        //Console.log(e);
    }
}

Gravity.sendAddToPublicFavorites = function(id)
{
    try
    {
        if (id)
        {
            //Console.log(typeof(ids));
            //Console.log(ids);

            var params = {
                action: 'AddToPublicFavorites',
                productId: id
                };
            this.getInstance().sendRequest(params);
        }
    }
    catch (e)
    {
        //Console.log(e);
    }
}

Gravity.recommendationClicked = function(a, id, recommendationId, position)
{
	//alert(id+"::"+recommendationId+"::"+position);return false;
    try
    {
        if (id && recommendationId && (position || position==0))
        {
            //Console.log(typeof(ids));
            //Console.log(ids);
            var params = {
                action: 'RecommendationClicked',
                productId: id,
                recommendationId: recommendationId,
                position: position
                };
            var on_complete = function(){window.location = a.href;};
            this.getInstance().sendRequest(params, on_complete);
        }
    }
    catch (e)
    {
        //Console.log(e);
    }
}

Gravity.sendProductVote = function(id, voteValue, voteText/*, position*/)
{
    try
    {
        if (id)
        {
            var params = {
                action: 'ProductVote',
                productId: id,
                voteValue: voteValue,
                voteText: voteText,
                recommendationId: null/*,
                position: position*/
            };
            this.getInstance().sendRequest(params);
        }
    }
    catch (e)
    {
        alert(e);
    }
}


Gravity.getRecommendation = function(targetElement, data)
{
    try
    {
        if (typeof(data) == 'object')
        {
            //Console.log(targetElement);
            //Console.log(data);
            var params = data;
            params['action'] = 'GetRecommendation';
            //Console.log(params);
            this.getInstance().getRecommendation(targetElement, params);
        }
    }
    catch (e)
    {
       // Console.log(e);
    }
}

Gravity.getRecommendationByJS = function(params)
{
    try
    {
        if (typeof(params) == 'object')
        {
            //Console.log(params);
            this.getInstance().getRecommendationByJS(params);
        }
    }
    catch (e)
    {
       // Console.log(e);
    }
}

Gravity.addEvent = function(params)
{
    try
    {
        if (typeof(params) == 'object')
        {
            //Console.log(params);
            this.getInstance().addEvent(params);
        }
    }
    catch (e)
    {
       // Console.log(e);
    }
}

Gravity.commit = function()
{
    try {
     	this.getInstance().commit();
    } catch (e) {
       // Console.log(e);
    }
}

Gravity.recoClicked = function(params)
{
    try {
     	this.getInstance().recoClicked(params);
    } catch (e) {
       // Console.log(e);
    }
}
