jQuery.fn.exists = function() { return (this.length > 0); };
jQuery.fn.outerHTML = function() { return jQuery('<div />').append(this.eq(0).clone()).html();};

var page = 0;


jQuery(function(){

	$(window).scroll(function () {
		if ($(window).scrollTop() > 24) {
     		
    		$('#basket-panel').css('top', $(window).scrollTop()+'px'); 
    		
    	} else {
            
            $('#basket-panel').css('top', '24px');
    	}
    	//alert($(window).scrollTop());
    });
    
    $('#main-navigation li').hover(
        function() {
            if($(this).find('.main-nav-box').is(':hidden'))
                $(this).find('.main-nav-box').slideDown('fast');   
        },
        function() {
            $(this).find('.main-nav-box').slideUp('fast');     
        }
    );
    
    $('.main-nav-box').each(function(){
        $(this).find('.nav-box:last').css('border-right','none');
        //$(this).width($(this).find('.nav-box').width());
    });
    
    $('#header-panels li').hover(
        function() {
            $(this)
            .find('a')
            .addClass('selected')
            .find('img').attr('src', '/media/images/promo/xmas11/'+$(this).attr('id')+'_selected.png');
            
            if($(this).find('.expanded-box-wrapper').is(':hidden'))
                $(this).find('.expanded-box-wrapper').slideDown('fast');            
        },
        function() {
            $(this)
            .find('a')
            .removeClass('selected')
            .find('img').attr('src', '/media/images/promo/xmas11/'+$(this).attr('id')+'.png');     
            
            $(this).find('.expanded-box-wrapper').slideUp('fast');
        }
    );
    
    $('.jshide').hide();
    
    $('#refine-panel input[type="checkbox"],select[name="sort"],select[name="pp"]').live('change',function(){
        refreshProducts();
    });
    
    $('.toggle-checkbox').live('click', function(){
        //alert('clicked checkbox');
        var checkbox = $(this).siblings('input[type="checkbox"]');
        if(checkbox.is(':checked')) {
            //alert('checked');
            checkbox.removeAttr('checked'); 
            $(this).closest('li').removeClass('selected');
        } else {
            //alert('not-checked');
            checkbox.attr('checked','checked');   
            $(this).closest('li').addClass('selected');
        }                   
        checkbox.trigger('change');                    
        
        return false;
    });

    
    $('.paginate a').live('click', function(){
        var data = getURLArguments($(this).attr('href'));
        if(data['p']!='undefined') {
            page = data['p'];
        }
            
        refreshProducts();
        return false;
    });
    
    $('#help-topics a:not(#help-topics ul a)').click(function(){   
        var hasClass = $(this).hasClass('selected');
        $('#help-topics a').removeClass('selected'); 
        $('#help-topics ul').hide();
        $('#topic-panel div').hide();
        if(!hasClass) {
            $(this).addClass('selected');
            var el=$(this).attr('href');
            el=el.substr(el.indexOf('#'));
            $(el).show();            
        }   
        return false;
    });
    
    $('#help-topics ul a').click(function(){
        var hasClass = $(this).hasClass('selected');   
        $('#help-topics ul a').removeClass('selected'); 
        $('#topic-panel div').hide();
        if(!hasClass) {
            $(this).addClass('selected');
            var el=$(this).attr('href');
            el=el.substr(el.indexOf('#'));
            $(el).show();            
        }
        
        return false;
    });    
    
    $('#box-control li a').click(function(){
        $('#box-control li').removeClass('selected');
        $('#box div').hide(); 
        $(this).closest('li').addClass('selected'); 
        var el=$(this).attr('href');
        el=el.substr(el.indexOf('#'));
        $(el).show();   
        return false;        
    });
    
    $('#box div').hide();
    $('#box div:first').show();
    
    $('a[rel="external"]').click(function(){
        window.open( $(this).attr('href') );
        return false;        
    });
    
    //$('#product-main').html($('#product-main form:first fieldset').html());
    
    $('input.radio[name="billingindex"], input.radio[name="shippingindex"]').change(function(){
        updateIndexes();
    });
    
    $('select[name="d"]').change(function(){
        var newLoc = window.location.toString();
        var idx = newLoc.indexOf('?');
        if(idx != -1)
            newLoc = newLoc.substr(0,idx);
            
        window.location = newLoc+'?d='+$('select[name="d"]').val();
    });
    
    $('#update-bag').click(function(){
        $(this).closest('fieldset').append($('<input type="hidden" name="updateBasket" value="1" />'));
        $(this).closest('form').submit();
        return false;
    });
    
    $('#empty-bag').click(function(){
        $(this).closest('fieldset').append($('<input type="hidden" name="emptyBasket" value="1" />'));
        $(this).closest('form').submit();
        return false;
    });
    
    $('.remove-item').click(function(){
        $(this).closest('fieldset').append($('<input type="hidden" name="removeItem" value="'+$(this).attr('rel')+'" />'));
        $(this).closest('form').submit();
        return false;
    });
    
    $('input[name="payment-type"]').change(function() {
        if($('#error-details').exists()) {
            $('#error-details').fadeOut('slow');
        }
        updatePaymentForm();
    });
    
    $('.submit').live('click', function() {

        if($(this).closest('form').exists()) {
            if($(this).closest('form').find('input[name="check_password"]').exists()) {
                
                // Validate password boxes
                if($('input[name="c_password"]').val()==$('input[name="c_password_2"]').val()) {
                    
                    if($('input[name="c_password"]').val().length < 6 || $('input[name="c_password"]').val().length > 12) {

                        $('input[name="c_password"]').focus();
                        alert("Please enter a password that is between 6-12 characters long");
                        return false;
                    }
                } else {
                    
                    $('input[name="c_password_2"]').focus();
                    alert("The two passwords do not match");
                    return false;
                }
                
            }                 
            
            $(this).closest('form').find('input[name="submit"]').remove();
            $(this).closest('form').submit();
        } 
        return false;
    });
    
    $('#sub-images li a').click(function(){
        $('#main-images li').hide();
        var el=$(this).attr('href');
        el=el.substr(el.indexOf('#'));
        $(el).show();   
        $('#zoom').attr('href',$(el).find('a:first').attr('href'));
        MagicZoom.refresh();
        $(el).find('a').css('width',$(el).siblings('li').find('a').css('width')); 
        //$(el).find('a').css('height',$(el).siblings('li').find('a').css('height')); 
        return false;          
    });
    
    $('#main-images li:first').show();
    
    $('.product #product .opt li').live('click', function() {
        $(this).find('input').attr('checked', 'checked');
        $(this).closest('ul').find('li').removeClass('selected');
        $(this).addClass('selected');
        updateProductVariation($(this).find('input').get(0));
        return false;
    });
    
    $('input.clear-input').each(function(){
        
        $(this).data('origVal', $(this).val());
    });
    
    $('input.clear-input')
    .focusin(function() {
        
        if($(this).val()==$(this).data('origVal'))
            $(this).val(''); 
        
    })
    .focusout(function(){
        
        if ($(this).val()=='') {
            $(this).val($(this).data('origVal'));
        }    
        
    });
    
    $('a.external').click(function() {

        window.open($(this).attr('href'));        
    });
    
    /*if(window.location.hash) {
        var ul = $(window.location.hash);
        if(ul.exists()) {
            var a = ul.siblings('a');
            var hasClass = a.hasClass('selected');
            $('#help-topics a').removeClass('selected'); 
            $('#help-topics ul').hide();
            $('#topic-panel div').hide();
            if(!hasClass) {
                a.addClass('selected');
                $(ul).show();            
            }   
        }
    } */   
    
    if($('#refine-panel').exists() && $('#refine-panel').css('height')=='0px') {
        $('#products-panel').css('width','auto');
    }
    
    $('#bag-panel').submit(function() {
        if(!$('#top-header-container #bag').data('old'))
            $('#top-header-container #bag').data('old', $('#top-header-container #bag').html());
            
        $('#top-header-container #bag')
        .addClass('loading')
        .html('<img src="/media/images/icons/ajax-loader-smallest-bag.gif" alt="Loading..." style="height: 18px; width: 140px;" />');
        
        var pdata = 'act=ubag';
        $('#bag-panel input:[type="hidden"], #bag-panel input.radio:checked').each(function() { // Get all member attributes (serialize into string)!
            pdata += '&'+$(this).attr('name')+'='+$(this).val();   
        });
        
        $.post('/ajax',
        pdata,
        function(data){
            
            if(data.error) {
                alert(data.error);
                $('#top-header-container #bag')
                .removeClass('loading')
                .html($('#top-header-container #bag').data('old'))
                .data('old', null);
                return;
            }
            //alert(data.result);    
            $('#top-header-container #bag')
            .removeClass('loading')
            .html(data.result.bag);
            var panel = $(data.result.panel);
            
            if($('#top-header-container #basket-panel').exists()) {
                if($('#top-header-container #basket-panel').is(':hidden')) // Check if the panel is already hidden, if so we'll keep it this way and fade it in nicely.
                    panel.hide();
                    
                $('#top-header-container #basket-panel').replaceWith(panel);
                if(panel.is(':hidden'))
                    panel.fadeIn(500);
                    
            } else {     
                panel.hide();
                $('#top-header-container').append(panel);
                panel.fadeIn(500);
            }
            $('#top-header-container #basket-panel .close-panel').click(function(){
                $('#top-header-container #basket-panel').fadeOut(500);
                return false;
            });
            
            $('#top-header-container #bag').data('old', null);
        },'json');
        
        return false; 
    });

    unFocus.History.addEventListener('historyChange', historyListener);
    historyListener(unFocus.History.getCurrent()); 

    //$('.opt input, .opt select').attr('checked', '');
    $('.opt input, .opt select').each(function(){
        if($(this).is(':checked'))
            $(this).closest('li').addClass('selected');
    });
    $('.opt input:not(input.radio)').val('');
    //$('input[name="payment-type"]').attr('checked', '');
    
    $('#checkout-addresses .addnewaddress').click(function(){
        $('#checkout-addresses').hide();
        $('#checkout-newaddress').show();
        return false;
    });
    
    $('#checkout-newaddress #cancel').click(function(){
        $('#checkout-addresses').show();
        $('#checkout-newaddress').hide();
        $('#checkout-newaddress input')
        .not(':button, :submit')
        .val('');
        return false;
    });
    
    $('#checkout-addresses input[name="shippingaddressindex"], #checkout-addresses input[name="billingaddressindex"]').change(function() {
        updateCheckoutAddress(this);
    });
    
    if($('#product').exists()) {
        
        $('#complete-look').height($('#product').height()-35); // Includes padding
    }
    
    if($('#basket').exists()) {
        
        $('#complete-look').height($('#basket').height()-44); // Includes padding
    }
    
    var productspanel = $('#products-panel');
    var newcontrolbar = productspanel.find('.control-bar');
    
    $('.pagination-container').each(function(){
        if($(this).find('.control-bar').exists()) {
            $(this).find('.control-bar').remove();
        }
        
        $(this).append(newcontrolbar.clone());
    });
    
    newcontrolbar.remove();
    
    $('#header-panels li').each(function(){
        
        $(this).find('.expanded-box-header').width($(this).find('a').width()+14);
        
        var a = $(this).find('a').clone();
        a.html('&nbsp;');
        $(this).find('.expanded-box-header:not(.expanded-box-header.no-link)').after(a);
    });
    
    $('.select-all').click(function(){
        
        $(this).focus();
        $(this).select();
    });
    
    $('input[name="d"]').live('change', function(){
        
        var d = $('input[name="d"]:checked').val();
        $.post('/ajax',
        {
            act: 'ushippingoption',
            d: d
        },
        function(data) {
            
            if(data.error) {
                
                alert(data.error);
                return false;
            }
            
            if(data.result=='OK') {
                
                RefreshBasketTotals();               
            }
            
        }, 'json');        
        
    });
    
    updateCheckoutAddress(null);
});

function addHistoryEntry(val) { // Expects a javascript object
    var str = '';
    for(key in val) {
        if(key=='var') {
            for(k in val[key]) {
                str += '&'+k+'='+val[key][k];
            }
        } else {        
            str += '&'+key+'='+val[key];
        }
    }
    unFocus.History.addHistory(str);    
}   

function historyListener(historyHash) {
    if(historyHash) {
        if(typeof(window.location.pathname)=='undefined' || window.location.pathname=='/help') {
            $('#'+historyHash).siblings('a').addClass('selected');
            $('#'+historyHash).show();            
        } else {
            historyHash += '&act=plist';
            //var data = $.evalJSON(historyHash);
            LoadOverlay('show');
            $.post('/ajax',
            historyHash, 
            function(data){
                if(data.error) {
                    alert(data.error);
                    return;
                }
                
                var productspanel = $('<div>'+data.result.products+'</div>');
                var newcontrolbar = productspanel.find('.control-bar');
                
                $('.pagination-container').each(function(){
                    if($(this).find('.control-bar').exists()) {
                        $(this).find('.control-bar').remove();
                    }
                    
                    $(this).append(newcontrolbar.clone());
                });

                newcontrolbar.remove();
                
                $('#products-panel').html(productspanel.html());
                $('#refine-panel').html(data.result.refine);
                $('.jshide').hide();
                page = 0;
                LoadOverlay('hide');
                /*$('#refine-panel input[type="checkbox"]').each(function(){
                    var el = $('<div class="checkbox-cover '+($(this).is(':checked')?'checked':'')+'"></div>');
                    el.click(function(){
                        $(this).toggleClass('checked');
                        $(this).parent().find('label input').trigger('click');    
                    }); 
                    $(this).closest('li').append(el)
                });*/
            },'json');
        }
    }
}         
          
function updateProductVariation(el) {
        
    if($('.product #product .opts').exists()) {
        var changed = $(el).attr('name');
        if(changed!='colour') {
            var pdata = {
                'act': 'uopt',
                'p_id': $('input[name="p_id"]').val()
            };
                                           
            $('.product #product .opts input:[type="hidden"], .product #product .opts input.radio:checked').each(function() {
                //alert($(this).val());
                pdata[$(this).attr('name')] = $(this).val();    
            });
            
            pdata['changed'] = changed;       
            
            //$('.product #product .opts').html('<img src="/media/images/icons/ajax-loader-smallest.gif" alt="Loading..." />');
            
            $.post('/ajax', pdata,
            function(data){
                           
                if(data.error) {
                    alert(data.error);
                    return;
                }
                
                if(!data.result) {
                    $('.opt:not(#'+pdata['changed']+')').remove();
                } else {
                    $(data.result).each(function(){
                        var $newopt = $(this);
                        if($newopt.find('input[type="radio"]').length==1) {
                            if(!$.browser.msie) {
                                //$newopt.find('li').addClass('selected');
                                //$input = $newopt.find('input');
                                //if($input.exists())
                                //    $input.attr('checked', 'checked');
                                    
                                //$newopt.hide();
                            }
                                
                        }                        
                        var $opt = $('.product #product #'+$(this).attr('id'));
                        if($opt.exists()) {
                            $opt.hide();
                            $opt.replaceWith($(this));
                        } else {
                            $('.product #product .opts').append($(this));
                        }
                    }); 
                }            

            },'json');
        }
    }
}

function RefreshBasketTotals() {
    
    $.post('/ajax',
    {
        act: 'urefreshtotals'
    },
    function(data) {
        
        if(data.result) {
            
            $('#basket-totals').html(data.result);
        }
        
    }, 'json'); 
    
}

function updatePaymentForm() {
    //$('#payment-form').html('<img src="/media/images/icons/ajax-loader-small.gif" alt="Loading..." />');
    $('#payment-form')
    .html('')
    .hide();
    $.post('/ajax',
    {
        'act': 'upayment',
        'payment-type': $('input[name="payment-type"]:checked').val()        
    },
    function(data){
        if(data.error) {
            alert(data.error);
            return;
        }
        
        var image = $('input[name="payment-type"]:checked').siblings('img');
        var selectedpayment = $('<div id="selected-payment-option"><p><img style="vertical-align:middle;" src="'+image.attr('src')+'" alt="'+image.attr('title')+'" title="'+image.attr('title')+'" /></p><p>You have selected to pay via '+$('input[name="payment-type"]:checked').siblings('img').attr('title')+' [<a style="color: #0071B9;" href="#" id="change">Change</a>]</p></div>');
        selectedpayment.find('#change').click(function(){
            $('#selected-payment-option').remove();
            $('#payment-form').hide();
            $('input[name="payment-type"]').removeAttr('checked');
            $('#payment-option').show();
            return false;
        });
        
	 	//RefreshBasketFooter();
        $('#payment-option')
        .after(selectedpayment)
        .hide();
        $('#payment-form').html(data.result);
        $('#payment-form').show();
        /*.animate({
            height:     'show'
        },100);    */

	 
    },'json');
}

function updateIndexes() {
    $.post('/ajax',
    {
        'act': 'uindexes',
        'billingindex': $('input.radio[name="billingindex"]:checked').val(),
        'shippingindex': $('input.radio[name="shippingindex"]:checked').val()
    }, 
    function(data){
        if(data.error) {
            alert(data.error);
            return;
        }
    },'json');    
    return false;
}

function getURLArguments(href) {
    var idx = (href.indexOf('?')==-1)?href.indexOf('&'):href.indexOf('?');
    var params = new Array();
    if (idx != -1) {
        var pairs = href.substring(idx+1, href.length).split('&');
        for (var i=0; i<pairs.length; i++) {
            nameVal = pairs[i].split('=');
            params[i] = nameVal[1];
            params[nameVal[0]] = nameVal[1];
        }
    }
    return params;
}

function refreshProducts() {
    LoadOverlay('show');
    var terms = $('input[name="terms"]').val();
    var categoryData = [];
    $('#refine-panel input[name="category[]"]:checked').each(function(){
        categoryData.push($(this).val());
    });
    
    var varData = [];
    $('#refine-panel input[type="checkbox"]:not(input[name="category[]"]):checked').each(function() {
        var name = $(this).attr('name'); name = name.substr(0, name.length-2);
        if(typeof(varData[name])=='undefined')
            varData[name] = [];
            
        varData[name].push($(this).val());
    });
          
    var data = {
        'category': categoryData,
        'id' : $('input[name="id"]').val(),
        'var': varData,
        'sort': $('select[name="sort"]').val(),
        'pp': $('select[name="pp"]').val(),
        'p': page,
        'terms': terms
    }; 
    addHistoryEntry(data);
}

function LoadOverlay(display) {
    if(display=='hide') {
        $('#load-overlay').hide();
    } else if (display=='show') {
        var height = $('#product-main').height()-25;
        //alert(height);
        var margin = Math.ceil((height/2))+'px auto'; 

        $('#load-overlay').height(height);
        $('#load-overlay #load-box').css('margin',margin);
        $('#load-overlay').show(); 
    }
}

function updateCheckoutAddress(el) {
    if($('input[name="shippingaddressindex"]:checked').val()==$('input[name="billingaddressindex"]:checked').val()) {
        $('#billing-address #same-address').remove();
        
        var html = $('<p id="same-address">Same as Shipping Address [<a style="color: #0071B9;" href="#" id="change">Change</a>]</p>');
        html.find('#change').click(function(){
            $('#billing-address #same-address').remove();
            $('#billing-address .address-data').show();
            return false; 
        });
        
        $('#billing-address h3').after(html);
        $('#billing-address .address-data').hide();
        
    } else {
        $('#billing-address #same-address').remove();
        $('#billing-address .address-data').show();
    }
    
    if(el != null && $(el).attr('name')=='shippingaddressindex') {
        
        
        $('#shipping-option .address-data').html('<img src="/media/images/icons/ajax-loader-small.gif" alt="Loading..." />');
        
        $.post('/ajax', 
        {
            
            act:    'udelivery',
            index:  $(el).val()
        }, 
        function(data) {
            
            if(data.error) {
                alert(data.error);
            }
            
            if(data.result) {
                
                $('#shipping-option .address-data').html(data.result);
                updateShippingOptionChecked();                    
            }
            
        }, 'json');
        
    }
    updateShippingOptionChecked();

}

function updateShippingOptionChecked() {

    if(!$('#shipping-option .address-data input.radio:checked').exists())
        $('#shipping-option .address-data input.radio:first').attr('checked', 'checked');    
}


function dump(arr,level) {
    var dumped_text = "";
    if(!level) level = 0;
    
    //The padding given at the beginning of the line.
    var level_padding = "";
    for(var j=0;j<level+1;j++) level_padding += "    ";
    
    if(typeof(arr) == 'object') { //Array/Hashes/Objects 
        for(var item in arr) {
            var value = arr[item];
            
            if(typeof(value) == 'object') { //If it is an array,
                dumped_text += level_padding + "'" + item + "' ...\n";
                dumped_text += dump(value,level+1);
            } else {
                dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
            }
        }
    } else { //Stings/Chars/Numbers etc.
        dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
    }
    return dumped_text;
}
