/**
 * Preselector Saunier Duval
 * @version 1.0
 * @copyright 2009 kernpunkt GmbH
 * created: 02.02.2009
 */

// definitions
var numberLevels = 4;
var offsetLeft   = 15;
var offsetTop    = 30;
var preselectorRequestURL = '/stepone2/frontend/general/system_configurator/products.php';

/**
 * Restore Preselector
 */
$(document).ready(

    function () {

        // {{{ ajax request to get the css product selectors, questions and answers from session
        $.ajax({
            type: 'GET',
            dataType: 'json',
            url:  preselectorRequestURL,
            data: 'action=getSelectors',

            success: function(responseJSON) {
                
                if (responseJSON.product_selector.length > 0)
                {
                    var storedSelectors = responseJSON.product_selector;
                    // show, hide products
                    $('#preselectorProducts').find('li:not(' + storedSelectors + ')').removeAttr('selected');
                    $('#preselectorProducts').find('li:not(' + storedSelectors + ')').fadeTo('slow', 0.4);
                    $('#preselectorProducts').find(storedSelectors).attr('selected', 'selected');
                    $('#preselectorProducts').find(storedSelectors).fadeTo('slow', 1.0);
                }
                
                if (responseJSON.questions.length > 0)
                {
                    var aQuestions = responseJSON.questions.split(',');
                    
                    for (var counter = 0; counter <  aQuestions.length; counter++)
                    {
                        var parentClass = getParentClass(aQuestions[counter]);
                        var levelClass = getLevelClass(aQuestions[counter]);
                        var level = getLevel(levelClass);
                        
                        if (level > 0)
                        {
                            // show question
                            sParentSelector = 'div .' + parentClass;
                            $(sParentSelector).fadeIn('slow');
                        } 
                    }
                }
                
                if (responseJSON.answers.length > 0)
                {
                    var aAnswers = responseJSON.answers.split(',');

                    for (var counter = 0; counter <  aAnswers.length; counter++)
                    {
                        // mark selected answer as checked
                        $('#' + aAnswers[counter]).attr('checked', 'checked');
                    }
                }
            }
        });

    }
);

/**
 * Preselector Events
 */
$(document).ready(

	function () {

        // handle the questions and answers of the preselector
		$('div.preselector ul li input').click(
			function() {

                // remove the product view
                $('#preselectorProductView').remove();

				var currentClass = $(this).parent().attr('class');
				var structureId = getSturctureId(currentClass, 'struct');

                // {{{ compute set of questions, answers to show, hide
				var level = getLevel($(this).parent().parent().parent().attr('class'));
				nextLevel = level + 1;
				// }}}

                // {{{ compute set of products to show, hide
                var selectortSubTree = $('ul.selector_tree li.struct' + structureId).find('li');

                var structures = new Array(selectortSubTree.length);
                structures[0] = '.' + currentClass;
                for (var counter = 0; counter < selectortSubTree.length; counter++)
                {
                    structures[(counter + 1)] = '.' + $(selectortSubTree[counter]).attr('class');
                }

                var sCssSelectors = structures.join(", ");
                // }}}

                // hide questions, answers
                for (var i = nextLevel; i < numberLevels; i++)
                {
                    $('div .level' + i).hide();
                    $('div .level' + i + ' input').attr('checked', '');
                }
                
                // show questions, answers
				sSelector = 'div .parent' + structureId;
                $(sSelector).fadeIn('slow');

                // show, hide products
                $('#preselectorProducts').find('li:not(' + sCssSelectors + ')').removeAttr('selected');
                $('#preselectorProducts').find('li:not(' + sCssSelectors + ')').fadeTo('slow', 0.4);
                $('#preselectorProducts').find(sCssSelectors).attr('selected', 'selected');
                $('#preselectorProducts').find(sCssSelectors).fadeTo('slow', 1.0);
                
                // {{{ get the selected questions and answers
                var selectedQuestions = $('#preselectorList').find("div.preselector:visible");
                var questions = new Array(selectedQuestions.length);
                var answers = new Array();
                
                for (var i = 0; i < selectedQuestions.length; i++)
                {
                    questions[i] = $(selectedQuestions[i]).attr('class');
                    var selectedAnswer = $(selectedQuestions[i]).find('input:checked');
                    
                    if (selectedAnswer.length == 1)
                    {
                        answers[i] = $(selectedAnswer[0]).attr('id');
                    } 
                    
                }
                // }}}
                
                var questionsSelectors = questions.join(",");
                var answersSelectors = answers.join(",");
                
                // get number of selected products
                var numberOfProducts = $('#preselectorProducts').find('[selected]');
                
                // {{{ ajax request to store the selected products, questions and answers
                $.ajax({
                    type: 'GET',
                    url:  preselectorRequestURL,
                    data: encodeURI('action=setSelectors&cssSelectors=' + sCssSelectors + 
                          ('&numberOfProducts=' + numberOfProducts.length) +
                          ('&selectedQuestions=' + questionsSelectors) +
                          ('&selectedAnswers=' + answersSelectors)),

                    success: function(response) {
                    
                        // change number of products in lefthand preselector icon
                        var numberOfSelectedProducts = response;
                        $('#numproducts').text(numberOfSelectedProducts); 
                        $('#preselector a').toggleClass('noitem', (numberOfSelectedProducts == 0));
                       
                    }
                });
                

			}
		);

        // handle the view of a product
        $('#preselectorProducts ul li img').click(
            function() {

                var parentElement = $(this).parent();
                var currentSatus = $(parentElement).attr('selected');
                $('#preselectorProductView').remove();

                if (currentSatus == 'selected')
                {
                    var currentObjectId = $(parentElement).attr('id');
                    var currentObjectContent = $('#' + currentObjectId + ' div');

                    var position = $('#preselectorProducts').position();
                    var positionLeft = (position.left + offsetLeft) + 'px';
                    var positionTop = (position.top + offsetTop) + 'px';

                    // get the (hidden) content of a product
                    var content = $('#' + currentObjectId + ' div') .
                                    clone() .
                                    attr('id', 'preselectorProductView') .
                                    css("top", positionTop) .
                                    css("left", positionLeft);

                    // append and display the product to the content area
                    $('#content').append(content);
                    $(content).slideDown("slow");
                }

            }
        );

        // display tooltip of a product
        $("#preselectorProducts ul li").tooltip({
            bodyHandler: function() {

                var currentObjectId = $(this).attr('id');
                var currentThumbail = $('#' + currentObjectId + ' img');
                $(currentThumbail).attr('alt', '');
                var currentTooltip = $('#' + currentObjectId + ' div h2').text();
                return currentTooltip;
            },
            showURL: false
        });

        // close product view
        $('#preselectorProductView').livequery('click',
            function() {
                 $(this).fadeOut("slow");
                 $(this).remove();
            }
        );

        // close product view by link
        $('#preselectorProductView a.close').livequery('click',
            function() {
                 $('#preselectorProductView').fadeOut("slow");
                 $('#preselectorProductView').remove();
            }
        );

        // reset preselector
        $('#preselectorList button').click(
            function() {

                // hide product
                $('#preselectorProductView').remove();
                // hide questions, answers
                for (var i = 0; i < numberLevels; i++)
                {
                    if (i > 0)
                    {
                        $('div .level' + i).fadeOut(100);
                    }
                    $('div .level' + i + ' input').attr('checked', '');
                }
                // hide thumbnails
                $('#preselectorProducts ul li').fadeTo("slow", 0.4).removeAttr('selected');
                
                // {{{ ajax request to reset the css product selectors from session
                $.ajax({
                    type: 'GET',
                    url:  preselectorRequestURL,
                    data: 'action=reset'
                });
                
                $('#numproducts').text('0');
                $('#preselector a').addClass('noitem');
               
            }
        );

        // remove title of the product thumbnail
        $('#preselectorProducts ul li img').hover(
            function() {
                 $(this).removeAttr('title');
            }
        );
        
	}

);


/**
 * Get the number part of a given style class.
 * E.g. given 'struct127' returns 127.
 *
 * @param  string sClass
 * @param  string sPrefix
 * @return int
 */
function getSturctureId(sClass, sPrefix) {

    var sturctureId = '';
    if (typeof sClass == "string" && typeof sPrefix == "string")
    {
        if (sClass.substring(0, sPrefix.length) == sPrefix)
        {
            var numberFilter = /[0-9]+/;
            sturctureId = sClass.match(numberFilter);
        }
    }
    return sturctureId;
}

/**
 * Get the parent class of a given style class.
 * E.g. given 'preselector level0 parent126' returns 'parent126'.
 *
 * @param  string sClass
 * @return string
 */
function getParentClass(sClass) {

    var parent = '';
    if (typeof sClass == "string")
    {
        
        var parentFilter = /parent[0-9]+/;
        parent = sClass.match(parentFilter);
        
    }
    return parent[0];
}

/**
 * Get the level class of a given style class.
 * E.g. given 'preselector level0 parent126' returns 'level0'.
 *
 *  @param  string sClass
 * @return string
 */
function getLevelClass(sClass) {

    var sLevel = '';
    if (typeof sClass == "string")
    {
        
        var levelClassFilter = /level[0-9]+/;
        sLevel = sClass.match(levelClassFilter);
        
    }
    return sLevel[0];
}

/**
 * Get the level number of a given style class.
 * E.g. given 'level3 parent126' returns 3.
 *
 * @param  string sClass
 * @return number
 */
function getLevel(sClass) {

    var result = new Number(0);
    if (typeof sClass == "string")
    {
        var levelFilter = /level([0-9])+/;
        var level = sClass.match(levelFilter);
    
        result = new Number(level[1]);
    }
    
    return result;
    
}

/**
 * Get the opacity value from the given style attribute.
 *
 * @param   sStyle
 * @return  number
 */
function getOpacity(sStyle) {

    if (typeof sStyle == "string") {
        var filter = /opacity: ([0-9]*[.]*[0-9])+;/;
        var opacity = sStyle.match(filter);
        return new Number(opacity[1]);
    }
    else
    {
        return new Number();
    }
}

function skip ()
{
   
}

