jQuery.fn.delegate = function(eventType, rules) {
  return this.bind(eventType, function(e) {
    var target = $(e.target);
    for(var selector in rules)
      if(target.is(selector)) 
        return rules[selector].apply(this, arguments);
  })
};

jQuery.fn.realOffset = function() {
	var that = this[0];
	var x = 0;
	var y = 0;
	do {
		x += that.offsetLeft;
		y += that.offsetTop;
	} while (that = that.offsetParent);
	return {left: x, top: y};
}

/* kills jumping to anchors and selecting their content */
$(function() {
	$("a[href^=#]").live('click', function(e) {
		e.preventDefault();
	}).live('selectstart', function(e) {
		e.preventDefault();
	});
});

jQuery.fn.slideOutRow = function(callback) {
	row = $(this);
	if(row.is('tr'))
	{
		$('td', row).each(function(){
			var el = $(this);
			el.css({
				verticalAlign: 'top'
			});
			var o = $('<span>').addClass('wrap').css({
				display: 'inline-block',
				verticalAlign: 'top',
				overflow: 'hidden'
			});
			var d = $('<span>').addClass('slideOut').css('overflow', 'hidden');
			d.css({
				display: 'inline-block',
				verticalAlign: 'top',
				paddingTop: el.css('paddingTop'),
				paddingBottom: el.css('paddingBottom')
			});
			el.css({
				paddingTop: 0,
				paddingBottom: 0
			});
			d.html(el.html());
			el.html('');
			d.appendTo(o);
			o.appendTo(el);
		});
		
		var t = 0;
		var c = 0;
		
		$('.slideOut', row).each(function(){
			c++;
			$(this).animate({
				marginTop: -row.height(),
				opacity: 0
			}, 300, 'swing', function(){
				row.remove();
				t++;
				if(t==c){
					if(typeof callback != 'undefined')
					{
						callback();
					}
				}
			});
		});
	}
};

function getQuerystring(key, default_)
{
	if (default_==null) default_=false;
	key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
	var qs = regex.exec(window.location.href);
	if(qs == null)
		return default_;
	else
		return qs[1];
}

jQuery.fn.setStartValue = function(startValue) { 
	var me = $(this);
	if(me.val() == '')
	{
		me.val(startValue);
	}
    me.focus(function(){
		if(me.val() == startValue)
		{
			me.val('');
		}
	}).blur(function(){
		if(me.val() == '')
		{
			me.val(startValue);
		}
	});
	return me;
}

function formSetup(url) {
	$("#simplemodal-container form").ajaxForm({
		target: $("#simplemodal-data"),
		url: url,
		success: function() {
			formSetup(url);
		}
	});
}

function setBasketSummary(text, total){
	$('.basket-text').text(text);
	$('.basket-total').html(total);
}

var shortlisted = {};

function setShortlistSummary(text){
	$('.wishlist-text').text(text);
}

function bindProductPage(urlname, colourUrlName, imagedata){

    var imageData = {};

    imageData[colourUrlName] = imagedata;

	var setInStock = function(inStock){
        var bar = $('.colour-bar');
		if(inStock){
			$('button span:not(:has(span))',bar).text('Add to Bag');
			Cufon.refresh();
		}else{
			$('button span:not(:has(span))',bar).text('Out of Stock');
			Cufon.refresh();
		}
	}

    var hideBasketMessage = function(){
        var conf = $('div.basket-confirm');
        if(conf.is(':visible')){
            conf.fadeOut();
        }
        var press = $('.press-item');
        if(press.length > 0 && !press.is(':visible')){
            press.fadeIn();
        }
    };

    var showBasketMessage = function(message, checkout){
	
        var conf = $('div.basket-confirm');
		
		if(typeof(checkout) != 'boolean')
		{
			checkout = true;
		}
	
		function show(message,checkout){
			if(checkout){
				$('.checkout', conf).removeClass('hidden');
			}else{
				$('.checkout', conf).addClass('hidden');
			}
			$('.success-message', conf).text(message);
			conf.fadeTo(250, 1);
		}
		
        if(conf.is(':visible')){
            conf.stop(true).fadeTo(250, 0.2, function(){
				show(message,checkout);
            });
        }else{
			conf.css({
				'display':'block',
				'opacity':0
			});
            var press = $('.press-item');
            if(press.length > 0){
                press.fadeOut();
            }
			show(message,checkout);
        }
    };

	var setShortLink = function(){

		var el = $('div.actions a.icon-link-wishlist');

		var link;
		var text;
		var colour = 1;

		var l = el.attr('href');
		if(-1 == l.indexOf('/remove/'))
		{
			colour = l.substring(l.indexOf('/add/') + '/add/'.length);
		}
		else
		{
			colour = l.substring(l.indexOf('/remove/') + '/remove/'.length);
		}

		if(typeof shortlisted[colour] != 'undefined'){
			link = '/wishlist/remove/' + colour;
			text = 'Remove';
		}else{
			link = '/wishlist/add/' + colour;
			text = 'Add to Wishlist';
		}

		if(text != el.text()){
			el.fadeTo(250, 0.5, function(){
				el.text(text);
				Cufon.refresh();
				el.attr('href', link).fadeTo(250, 1);
			});
		}else{
			el.attr('href', link);
		}

	};

	$('div.actions a.icon-link-wishlist').click(function(e){
		e.preventDefault();
		var link = $(this);
		$.getJSON(link.attr('href'), function(data){
			shortlisted = data.payload.shortlisted;
			setShortLink();
			setShortlistSummary(data.payload.text);
		});
	});

    function getColour(colourUrlName){
        if(typeof(imageData[colourUrlName]) == 'undefined'){
            $.getJSON('/product/get-images/' + urlname + '/?colour=' + colourUrlName, function(data){
                imageData[colourUrlName] = data.payload;
                showColour(imageData[colourUrlName]);
            });
        }else{
            showColour(imageData[colourUrlName]);
        }
    }

    function setActiveImage(el){
        $('.thumbnails a').removeClass('active');
        if(typeof(el) == 'undefined'){
            el = $('.thumbnails a:first');
        }
        el.addClass('active');
    }

    function showImage(url){
        var im = new Image();
        var leftim = $('.leftcol img');
        if(leftim.attr('src') && -1 == leftim.attr('src').indexOf(url)){
            leftim.fadeTo(250,0.1,function(){
                im.onload = function(){
                    leftim.attr('src', im.src).fadeTo(250,1);
                };
                im.src = url;
            });
        };
    }

    var showColour = function(data, stopfade){
        var first = true;

        var fade = false;
        if(typeof(stopfade) == 'undefined'){
            fade = true;
        }

        var cont = $('.rightcol .thumbnails').html('');
        $.each(data, function(k,v){

            if(first){
                showImage(v.detail);
                setActiveImage();
            }

            var nl = $('<a>').attr('href', '#').css('backgroundImage','url(' + v.thumb + ')');

            if(fade){
                nl.css('opacity', 0);
            }

            if(first){
                nl.addClass('active');
                first = false;
            }

            nl.appendTo(cont).fadeTo(750,1).click(function(e){
                e.preventDefault();
                setActiveImage($(this));
                showImage(v.detail);
            });

        });
    };

    var setArrow = function(){
        if($('span.colours .list').is(':visible')){
            $('span.colours').parent().addClass('expanded');
        }else{
            $('span.colours').parent().removeClass('expanded');
        }
    };

    var toggleDropDown = function(){
        var el = $('span.colours');
        el.children('span.list').slideToggle(setArrow);
    };

	var setStockMessage = function(){
        var ns = $('span.colours .active .no-stock');
        if(ns.length > 0){
            showBasketMessage('Sorry, ' + ns.text() + ' is currently unavailable', false);
			setInStock(false);
        }else{
			setInStock(true);
		}
	}
	
	// Check for a hash, otherwise show bound colour
	var currentHash = false;

    var setColour = function(el){
	
        hideBasketMessage();

        $('span.colours .active .colour').appendTo(
            $('span.colours .list')
        ).click(function(e){
            setColour($(this));
	        e.preventDefault();
	        e.stopPropagation();
        	toggleDropDown();
        }).removeClass('colouronhover');

        el.unbind('click');
        el.appendTo($('span.colours .active'));

		setStockMessage();
        
        var data = el.children('a:first').attr('rel');
        var parts = data.split('|');

        $('form#basket-add select#ddl-colours').val(parts[0]);

        getColour(parts[1]);

        $('div.actions a.icon-link-wishlist').attr('href', '/wishlist/add/' + parts[0]);
        setShortLink();

		if(parts[1]!=colourUrlName){
			window.location.hash = parts[1];
			currentHash = parts[1];
		}else{
			if(window.location.hash.length > 0){
				window.location.hash = colourUrlName;
			}
			currentHash = colourUrlName;
		}

    };
	
	var checkHash = function(){
		if(window.location.hash.length > 1){
			var hash = window.location.hash.substring(1);
		}else{
			var hash = colourUrlName;
		}
		if(hash != currentHash){
			currentHash = hash;
			var el = $('.colours .colour a[rel$="' + hash + '"]');
			if(el.length > 0){
				setColour(el.closest('.colour'));
				gotHash = true;
			}
		}
		setTimeout(checkHash, 1000);
	};
	
	// This does the initial image loading & continues to check for a different hash
	checkHash();

	if(!$('div.basket-confirm').is(':visible')){
		setStockMessage();
	}

    // Bind if active exists
    if($('span.colours .active').length > 0){
        
        $('span.colours .active').click(toggleDropDown);

        $('span.colours .list .colour').click(function(e){
            setColour($(this));
	        e.preventDefault();
	        e.stopPropagation();
        	toggleDropDown();
        });

    }

    $('body').delegate('click', {
        ':not(span.colours *)' : function(e) {
            $('span.colours .list').slideUp(300, setArrow);
        }
    });

    $('.product-bar h4.related-items').click(function(e){
        e.preventDefault();
        $('.product-bar h4.viewed-items').removeClass('active');
        $(this).addClass('active');
        Cufon.refresh();
        $('.viewed-grid .cell').fadeOut(function(){
            $('.related-grid .cell').fadeIn();
        });
    });

    $('.product-bar h4.viewed-items').click(function(e){
        e.preventDefault();
        $('.product-bar h4.related-items').removeClass('active');
        $(this).addClass('active');
        Cufon.refresh();
        $('.related-grid .cell').fadeOut(function(){
            $('.viewed-grid .cell').fadeIn();
        });
    });

    $('form#basket-add').submit(function(e){
		e.preventDefault();
		var form = $(this);
		var data = form.formSerialize();
		$.post(form.attr('action'), data, function(data){
			showBasketMessage(data.message, data.result);
			setBasketSummary(data.payload['totals']['text'],data.payload['totals']['rawprice']);
		}, 'json');
	});

}

$(document).ready(function(){

    $('a.modal').live('click', function(e){
        var that = $(this);
		$.get(that.attr("href"), "", function(data) {
			var modal = $.modal(data,{
				onShow: function(dialog) {
					$.modal.impl.setPosition();
                    Cufon.refresh();
				},
				overlayClose: true
			});
			$(".simplemodal-close").live("click", function(){
				e.preventDefault();
				modal.close();
			});
			formSetup(that.attr("href"));
		});
		e.preventDefault();
    });
    
    $('#footer .newsletter-signup').submit(function(e){
		e.preventDefault();
		var $this = $(this);
		var d = $this.formSerialize();
		$.post($this.attr('action'), d, function(data){
			data = eval(data);
			if(data.result){
                $this.fadeTo(250,0, function(){
                    $(':not(h4)',$this).remove();
                    $('h4',$this).text(data.payload);
                    Cufon.refresh();
                    $this.fadeTo(250,1);
                });
            }else{
                var p = $('#footer .newsletter-signup p.error');
                if(p.length == 0){
                    var elIn = $('input[type=text]', $this).css('border', '1px solid #E24948');
                    p = $('<p>').addClass('error').css({
                        'left' : elIn.offset().left - $this.offset().left + 'px',
                        'top' : (elIn.offset().top - $this.offset().top + elIn.height() + 5) + 'px',
                        'position' : 'absolute'
                    }).appendTo($this);
                }
                p.css('opacity',0).text(data.payload).fadeTo(250,1);
            }
		});
	});
	
});