/**
 * Initialize.
 * 
 */
$(document).ready(function() {	
    $('table.categoryBox').hover(categoryBoxOver, categoryBoxOut);
    $('#favoritesButton').click(function(e) {
        e.preventDefault();
        var bookmarkUrl = this.href;
        var bookmarkTitle = this.title;
        if (window.sidebar) { 
            window.sidebar.addPanel(bookmarkTitle, bookmarkUrl, '');
        } else if(window.external || document.all) {
            window.external.AddFavorite(bookmarkUrl, bookmarkTitle);
        } else if(window.opera) {
            $(this).attr("href",bookmarkUrl);
            $(this).attr("title",bookmarkTitle);
            $(this).attr("rel","sidebar");
        } else {
            alert('Tu navegador no soporta esta acción, usa Ctrl + D.');
        }
    });	
});

/**
 * Does search.
 *
 */
function doSearch(parameter) {
    if (parameter) {
        value = parameter;
    } else {
        var value = $('#search').val();        
    }
    value = value.replace(/^\s*|\s*$/g, '');
    value = value.toLowerCase();    
    value = value.replace('á', 'a');      
    value = value.replace('é', 'e');          
    value = value.replace('i', 'i');     
    value = value.replace('ó', 'o');     
    value = value.replace('ú', 'u');
    value = value.replace('ñ', 'n');
    value = value.replace(/[^0-9|a-z|\s]/g, '');
    value = value.replace(/\s\s+/g, ' ');    
    value = value.replace(/\s/g, '_');
    if (value == '') {
        location.href = ('/buscador/');        
    } else {
        location.href = ('/buscador/'+ value +'/');         
    }
}

/**
 * Category box over.
 * 
 */
function categoryBoxOver() {
    $(this).removeClass('borderLightGreenBox');
    $(this).addClass('borderGreenBox');			
}

/**
 * Category box out.
 * 
 */
function categoryBoxOut() {
    $(this).removeClass('borderGreenBox');
    $(this).addClass('borderLightGreenBox');		
}

/**
 * Print button over.
 * 
 */
function printButtonOver() {
    $(this).find('img').attr('src', 'images/printButtonSmallOver.jpg');	
}

/**
 * Print button out.
 * 
 */
function printButtonOut() {
    $(this).find('img').attr('src', 'images/printButtonSmall.jpg');		
}


/**
 * Paint button over.
 * 
 */
function paintButtonOver() {
    $(this).find('img').attr('src', 'images/paintButtonSmallOver.jpg');	
}

/**
 * Paint button out.
 * 
 */
function paintButtonOut() {
    $(this).find('img').attr('src', 'images/paintButtonSmall.jpg');		
}

/**
 * Opens send popup.
 * 
 */
function openSendPopup() {

    // Make content.

    var container = $('<div class="form"/>');

    var form = $('<form action="javascript:send();" />')
    $(container).append(form);

    var list = $('<ul/>');
    $(form).append(list);

    var nameLabel = $('<li class="label"><label for="recommendName">Tu nombre<span class="separator">&raquo;</span></label></li>');
    $(list).append(nameLabel);

    var nameField = $('<li class="field"><div class="roundedCornersInput"><div class="topBorder"><div class="bottomBorder"><div class="topLeftCorner"><div class="topRightCorner"><div class="bottomLeftCorner"><div class="bottomRightCorner"><div class="holder"><input type="text" id="recommendName" /></div></div></div></div></div></div></div></div></li>');
    $(list).append(nameField);

    var mailLabel = $('<li class="label"><label for="recommendMail">Email de destino<span class="separator">&raquo;</span></label></li>');
    $(list).append(mailLabel);

    var mailField = $('<li class="field"><div class="roundedCornersInput"><div class="topBorder"><div class="bottomBorder"><div class="topLeftCorner"><div class="topRightCorner"><div class="bottomLeftCorner"><div class="bottomRightCorner"><div class="holder"><input type="text" id="recommendMail" /></div></div></div></div></div></div></div></div></li>');
    $(list).append(mailField);

    var submit = $('<li class="submit"><div class="blueButton"><div class="left"/><div class="center"><input type="submit" value="Enviar"/></div><div class="right"/></div></li>');
    $(list).append(submit);

    // Open popup.

    $.popup.open('send', container, $('#recommendButton').position().top-100, ($('#recommendButton').position().left - 150));
	
}

/**
 * Sends.
 * 
 */
function send() {
    $.rpc.send(
        'MailService',
        'recommend',
        [{name:$('#recommendName').val(), mail:$('#recommendMail').val()}],
        function(result) {
            $.popup.close();
            alert('Mail enviado con éxito!');
        },
        function(fault) {
            $.popup.showMessage(fault);
        }
    );
}

//////////////
//          //
// CATEGORY //
//          //
//////////////

var mainCurrentPage = 1;
var mainId;
var mainTotalPages;
var mainFirstPage = 1;

var featuredCurrentPage = 1;
var featuredId;
var featuredTotalPages;
var featuredFirstPage = 1;

var secondaryCurrentPage = 1;
var secondaryId;
var secondaryTotalPages;
var secondaryFirstPage = 1;

var relatedCurrentPage = 1;
var relatedId;
var relatedTotalPages;
var relatedFirstPage = 1;

/**
 * Gets category box.
 * 
 * @param object record
 */
function getCategoryBox(record) {

    var categoryBox = $('<table class="borderLightGreenBox categoryBox" cellpadding="0" cellspacing="0">');
    $(categoryBox).hover(categoryBoxOver, categoryBoxOut);;

    var top = $('<tr class="top"><td class="left"></td><td class="center"></td><td class="right"></td></tr>');
    $(categoryBox).append(top);

    var middle = $('<tr class="middle"/>');
    $(categoryBox).append(middle);

    var left = $('<td class="left"/>');
    $(middle).append(left);

    var center = $('<td class="center"><a href="'+ ((record.path ? (record.path + '/') : '') + record.urlName +'/') +'"><img src="store/'+ record.imageId +'c.'+ record.imageType +'" alt="'+ record.name +'" title="'+ record.name +'"/></a></td>');
    $(middle).append(center);

    var right = $('<td class="right"/>');
    $(middle).append(right);

    var bottom = $('<tr class="bottom"><td class="left"></td><td class="center"></td><td class="right"></td></tr>');
    $(categoryBox).append(bottom);

    return categoryBox;
	
}

/**
 * Gets draw box.
 * 
 * @param object record
 */
function getDrawBox(record) {
	
    var categoryBox = $('<table class="borderLightGreenBox drawBox'+ (search ? ' search' : '') +'" cellpadding="0" cellspacing="0">');

    var top = $('<tr class="top"><td class="left"></td><td class="center"></td><td class="right"></td></tr>');
    $(categoryBox).append(top);

    var middle = $('<tr class="middle"/>');
    $(categoryBox).append(middle);

    var left = $('<td class="left"/>');
    $(middle).append(left);

    var center = $('<td class="center"/>');
    $(middle).append(center);

    var whiteBox = $('<div class="borderWhiteBox"><div class="topBorder"><div class="bottomBorder"><div class="leftBorder"><div class="rightBorder"><div class="topLeftCorner"><div class="topRightCorner"><div class="bottomLeftCorner"><div class="bottomRightCorner"><div class="holder"><a href="'+ (record.path +'/'+ record.urlName +'/')  +'" alt=" '+ record.name +'" title="'+ record.name +'" ><img title="'+ record.name +'" alt="'+ record.name +'" src="store/'+ record.imageId +'s.'+ record.imageType +'"/></a></div></div></div></div></div></div></div></div></div></div>');
    $(center).append(whiteBox);         

    if (search) {
        var stars = '';
        var i;
        for (i=0; i<(record.ranking); i++) {
            stars += '<span class="searchItemDescriptionStar on"></span>';
        }
        for (i=0; i<(5 - record.ranking); i++) {
            stars += '<span class="searchItemDescriptionStar off"></span>';
        }    
        var whiteBoxDescription = $('<div class="borderWhiteBox searchItemDescription"><div class="topBorder"><div class="bottomBorder"><div class="leftBorder"><div class="rightBorder"><div class="topLeftCorner"><div class="topRightCorner"><div class="bottomLeftCorner"><div class="bottomRightCorner"><div class="holder"><div class="searchItemDescriptionName"><span>»</span><a href="'+ (record.path +'/'+ record.urlName +'/') +'">'+ record.name +'</a></div><div class="searchItemDescriptionVotes">'+ stars +'</div><div class="searchItemDescriptionVisits">Pintado <strong>'+ record.visits +'</strong> veces.</div></div></div></div></div></div></div></div></div></div></div>');
        $(center).append(whiteBoxDescription);
    }

    var paintButton = $('<a class="paintButtonSmall" href="'+ (record.path +'/'+ record.urlName +'/')  +'"><img title="pintar" alt="pintar" src="images/paintButtonSmall.jpg"/></a>');
    $(paintButton).hover(paintButtonOver, paintButtonOut);
    if (search) {
        $(center).append(paintButton);        
    } else {
        $(whiteBox).append(paintButton);        
    }

    var printButton = $('<a href="gateway.php?action=print&amp;id='+ record.imageId +'" class="printButtonSmall" target="_blank">'+ (!search ? '<img title="imprimir" alt="imprimir" src="images/printButtonSmall.jpg"/>' : '') +'</a>');
    $(printButton).hover(printButtonOver, printButtonOut);
    if (search) {
        $(center).append(printButton);        
    } else {
        $(whiteBox).append(printButton);        
    }

    var right = $('<td class="right"/>');
    $(middle).append(right);

    var bottom = $('<tr class="bottom"><td class="left"></td><td class="center"></td><td class="right"></td></tr>');
    $(categoryBox).append(bottom);

    return categoryBox;	
	
}

/**
 * Update categories.
 * 
 * @param string type
 * @param array result
 * @param object value
 */
function update(type, result, value) {

    var totalPages;
    var currentPage;
    var pageLength;
    var firstPage;
    var target;

    // Initialize.

    if (type != 'recent' && type != 'related' && type != 'featured') {
        mainTotalPages = Math.ceil(result.count / mainPageLength);
        totalPages = mainTotalPages;
        currentPage = mainCurrentPage;
        pageLength = mainPageLength;
        firstPage = mainFirstPage;
        target = 'main';
        id = mainId;
    } else if (type == 'featured') {
        featuredTotalPages = Math.ceil(result.count / featuredPageLength);
        totalPages = featuredTotalPages;
        currentPage = featuredCurrentPage;
        pageLength = featuredPageLength;
        firstPage = featuredFirstPage;
        target = 'featured';
        id = featuredId;	        
    } else if (type == 'related'){
        relatedTotalPages = Math.ceil(result.count / relatedPageLength);
        totalPages = relatedTotalPages;
        currentPage = relatedCurrentPage;
        pageLength = relatedPageLength;
        firstPage = relatedFirstPage;
        target = 'secondary';
        id = relatedId;		
    } else {
        secondaryTotalPages = Math.ceil(result.count / secondaryPageLength);
        totalPages = secondaryTotalPages;
        currentPage = secondaryCurrentPage;
        pageLength = secondaryPageLength;
        firstPage = secondaryFirstPage;
        target = 'secondary';
        id = secondaryId;		
    }
	
    // Clean navigation.

    $('#'+ target +'Navigation div.pages').html('');

    // Update navigation.

    if ((currentPage - firstPage) > 4) {
        if (type != 'recent' && type != 'related' && type != 'featured') {
            mainFirstPage += 5;
            firstPage = mainFirstPage;
        } else if(type == 'related'){
            relatedFirstPage += 5;            
            firstPage = relatedFirstPage;
        } else if (type == 'featured') {
            featuredFirstPage += 5;             
            firstPage = featuredFirstPage;           
        } else {
            secondaryFirstPage += 5;            
            firstPage = secondaryFirstPage;
        } 
    } else if((currentPage - firstPage) == -1 && firstPage > 1) {
        if (type != 'recent' && type != 'related' && type != 'featured') {
            mainFirstPage -= 5;
            firstPage = mainFirstPage;
        } else if (type == 'related') {
            relatedFirstPage -= 5;             
            firstPage = relatedFirstPage;           
        } else if (type == 'featured') {
            featuredFirstPage -= 5;             
            firstPage = featuredFirstPage;                       
        } else {
            secondaryFirstPage -= 5;               
            firstPage = secondaryFirstPage;         
        }	
    }
    for (var p=firstPage; p<=totalPages; p++) {
        if (p != firstPage) {
            var separator = $('<span>|</span>');
            $('#'+ target +'Navigation div.pages').append(separator);
        }
        var page = $('<a '+ (p == currentPage ? 'class="current"' : '') +' href="javascript:go(\'set\', \''+ type +'\', '+ (id ? id : 'null') +', '+ p + (value ? (', \''+ value +'\'') :  '' ) +');">'+ p +'</a>');
        $('#'+ target +'Navigation div.pages').append(page);
        if ((p - firstPage) == 4) {
            break;
        }
    }
	
    // Clean.

    $('#'+ target +'Boxes ul').remove();

    // Render.

    var rows = $('<ul/>');
    for (var i=0; i<result.records.length; i++) {

        // Make row.

        var row = $('<li/>');
        $(rows).append(row);

        // Make cols.

        var cols = $('<ul/>');
        $(row).append(cols);

        // Add columns.

        for (var j=0; j<(search ? 3 : (type == 'recent' || type == 'related' || type == 'featured' ? pageLength : 4)); j++) {

            // Get record.

            var record = result.records[i + j];

            // Check record.

            if (!record) {
                break;
            }

            // Add column.

            var col = $('<li/>');
            $(cols).append(col);

            // Make box.

            $(col).append((type == 'category' || type == 'featured') ? getCategoryBox(record) : getDrawBox(record));

        }

        // Update index.

        i += (j - 1);

    }

    $('#'+ target +'Boxes').append(rows);
	
}

/**
 * Searchs.
 * 
 */
function search() {
    rpc('search', null, 1, $('#name').val());
}

/**
 * Rpc.
 * 
 * @param string type
 * @param uint id
 * @param uint pageNumber
 * @param string value
 */
function rpc(type, id, pageNumber, value) {
    var service;
    var method;
    var parameters;
    var resultHandler;
    switch (type) {
        case 'category':
            service = 'CategoryService';	
            method = 'search';	
            parameters = [{parentId:id, pageNumber:pageNumber, pageLength:mainPageLength}];
            resultHandler = function(result) {
                mainCurrentPage = pageNumber;	
                mainId = id;
                update(type, result);				
            }
        break;
        case 'draw':
            service = 'DrawService';
            method = 'search';			
            parameters = [{categoryId:id, pageNumber:pageNumber, pageLength:mainPageLength}];
            resultHandler = function(result) {
                mainCurrentPage = pageNumber;	
                mainId = id;
                update(type, result);				
            }
        break;
        case 'lastDraws':
            service = 'DrawService';
            method = 'search';			
            parameters = [{pageNumber:pageNumber, pageLength:mainPageLength, orderBy:'id', desc:true}];
            resultHandler = function(result) {
                mainCurrentPage = pageNumber;
                mainId = id;					
                update(type, result);				
            }		
        break;
        case 'morePainted':
            service = 'DrawService';
            method = 'search';			
            parameters = [{pageNumber:pageNumber, pageLength:mainPageLength, orderBy:'visits', desc:true}];
            resultHandler = function(result) {
                mainCurrentPage = pageNumber;
                mainId = id;					
                update(type, result);				
            }			
        break;
        case 'bestDraws':
            service = 'DrawService';
            method = 'search';			
            parameters = [{pageNumber:pageNumber, pageLength:mainPageLength, orderBy:'ranking', desc:true}];
            resultHandler = function(result) {
                mainCurrentPage = pageNumber;
                mainId = id;					
                update(type, result);				
            }			
        break;
        case 'search':
            service = 'DrawService';
            method = 'search';			
            parameters = [{name:value, categoryId:null, pageNumber:pageNumber, pageLength:mainPageLength}];
            resultHandler = function(result) {
                mainCurrentPage = pageNumber;
                mainId = id;					
                update(type, result, value);				
            }		
        break;
        case 'featured':
            service = 'CategoryService';
            method = 'search';			
            parameters = [{parentId:id, featured:true, pageNumber:pageNumber, pageLength:featuredPageLength}];			
            resultHandler = function(result) {
                featuredCurrentPage = pageNumber;
                featuredId = id;					
                update(type, result);				
            }
        break;        
        case 'recent':
            service = 'DrawService';
            method = 'search';			
            parameters = [{recursive:true, orderBy:'id', desc:true, categoryId:id, pageNumber:pageNumber, pageLength:secondaryPageLength}];			
            resultHandler = function(result) {
                secondaryCurrentPage = pageNumber;
                secondaryId = id;					
                update(type, result);				
            }
        break;
        case 'related':
            service = 'DrawService';
            method = 'search';			
            parameters = [{categoryId:id, pageNumber:pageNumber, pageLength:relatedPageLength}];			
            resultHandler = function(result) {
                relatedCurrentPage = pageNumber;
                relatedId = id;					
                update(type, result);
            }
        break;
    }
    $.rpc.send(
        service,
        method,
        parameters,
        resultHandler,
        function(fault) {
            alert(fault);
        }
    );		
}

/**
 * Goes.
 * 
 * @param string action
 * @param string type
 * @param uint id
 * @param uint pageNumber
 * @param string value
 */
function go(action, type, id, pageNumber, value) {

    var totalPages;
    var currentPage;
    var target;
    var pageLength;

    if (type != 'recent' && type != 'related' && type != 'featured') {
        mainParentId = id;
        pageLength = mainPageLength;
        totalPages = mainTotalPages;
        currentPage = mainCurrentPage;
        target = 'main';
    } else if(type == 'related'){
        relatedParentId = id;
        pageLength = relatedPageLength;	
        totalPages = relatedTotalPages;
        currentPage = relatedCurrentPage;
        target = 'secondary';
    } else if (type == 'featured') {
        featuredParentId = id;
        pageLength = featuredPageLength;	
        totalPages = featuredTotalPages;
        currentPage = featuredCurrentPage; 
        target = 'featured';            
    } else {
        secondaryParentId = id;
        pageLength = secondaryPageLength;	
        totalPages = secondaryTotalPages;
        currentPage = secondaryCurrentPage;
        target = 'secondary';
    }
    switch (action) {
        case 'set':
            if (pageNumber != currentPage) {
                rpc(type, id, pageNumber, value);
            }		
        break;
        case 'previous':
            if (currentPage > 1) {
                rpc(type, id, (currentPage - 1), value);		
            }		
        break;
        case 'next':
            if (totalPages) {
                if ((currentPage + 1) <= totalPages) {
                    rpc(type, id, (currentPage + 1), value);			
                }
            } else {
                if ($('#'+ target +'Navigation div.pages a').length > 1) {
                    rpc(type, id, (currentPage + 1), value);			
                }		
            }		
        break;
    }	
}

/**
 * Shows player.
 * 
 * @param uint categoryUrl
 * @param uint categoryImageId
 * @param uint drawId
 * @param uint imageId
 * @param string imageTpe
 * @param string baseUrl
 * @param string nextUrl
 * @param string logo
 */
function showPlayer(categoryUrl, categoryImageId, categoryImageType, drawId, imageId, imageType, baseUrl, nextUrl, logo) {

    var swfVersionStr = "10.0.0";
    var xiSwfUrlStr = "swfs/playerProductInstall.swf";
    var flashvars = {
        categoryUrl: categoryUrl,
        categoryImageId: categoryImageId,
        categoryImageType: categoryImageType,
        imageId: imageId,
        imageType: imageType,
        drawId: drawId,
        baseUrl: baseUrl,
        nextUrl: nextUrl
    };
    if (logo) {
        flashvars.logo = logo;		
    }
    var params = {};
    params.quality = "high";
    params.bgcolor = "#e9ba01";
    params.allowscriptaccess = "sameDomain";
    params.allowfullscreen = "true";
    params.wmode = "window";
    var attributes = {};
    attributes.id = "draws";
    attributes.name = "draws";
    attributes.align = "middle";
    swfobject.embedSWF(
        "swfs/draws.swf", "flashContent", 
        "100%", "100%", 
        swfVersionStr, xiSwfUrlStr, 
        flashvars, params, attributes
    );
    swfobject.createCSS("#flashContent", "display:block;text-align:left;");
	
}

/**
 * Resizes
 * 
 * @param uint height
 */
function resize(height) {
    $('#application').css('height', (height +'px'));
}

