function openPlayer(url) {
	if (typeof url == 'undefined') url = "http://mediaweb.musicradio.com/player/default.asp?s=59&e=0";
	else { url = "http://mediaweb.musicradio.com/player/default.asp?s=59&e=" + url; }
	try {
	    playerWin = window.open(url,'playerWin','width=607,height=558,toolbar=0,location=0,directories=0,status=1,menubar=0,scrollbars=0,resizable=1');
	}
	catch(error) {
	    // do nothing - IE returns an "unspecified error" when a previously opened window returns "false"
	    // generally from a window.confirm object triggered on an onbeforeunload event in an already rendered doc
	}
};

/*
	these functions get called on DOMready (using jQuery) and are called on every page of the site
*/

/* This is the "BlockUI" plugin, which gives the
   lightbox effect on the login dialog
*/

/*
 * jQuery blockUI plugin
 * Version 1.33  (09/14/2007)
 * @requires jQuery v1.1.1
 *
 * $Id$
 *
 * Examples at: http://malsup.com/jquery/block/
 * Copyright (c) 2007 M. Alsup
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 */
 (function($) {
$.blockUI = function(msg, css, opts) {
    $.blockUI.impl.install(window, msg, css, opts);
};
$.blockUI.version = 1.33;

$.unblockUI = function(opts) {
    $.blockUI.impl.remove(window, opts);
};

$.fn.block = function(msg, css, opts) {
    return this.each(function() {
		if (!this.$pos_checked) {
            if ($.css(this,"position") == 'static')
                this.style.position = 'relative';
            if ($.browser.msie) this.style.zoom = 1; // force 'hasLayout' in IE
            this.$pos_checked = 1;
        }
        $.blockUI.impl.install(this, msg, css, opts);
    });
};

$.fn.unblock = function(opts) {
    return this.each(function() {
        $.blockUI.impl.remove(this, opts);
    });
};

$.fn.displayBox = function(css, fn, isFlash) {
    var msg = this[0];
    if (!msg) return;
    var $msg = $(msg);
    css = css || {};

    var w = $msg.width()  || $msg.attr('width')  || css.width  || $.blockUI.defaults.displayBoxCSS.width;
    var h = $msg.height() || $msg.attr('height') || css.height || $.blockUI.defaults.displayBoxCSS.height ;
    if (w[w.length-1] == '%') {
        var ww = document.documentElement.clientWidth || document.body.clientWidth;
        w = parseInt(w) || 100;
        w = (w * ww) / 100;
    }
    if (h[h.length-1] == '%') {
        var hh = document.documentElement.clientHeight || document.body.clientHeight;
        h = parseInt(h) || 100;
        h = (h * hh) / 100;
    }

    var ml = '-' + parseInt(w)/2 + 'px';
    var mt = '-' + parseInt(h)/2 + 'px';

    // supress opacity on overlay if displaying flash content on mac/ff platform
    var ua = navigator.userAgent.toLowerCase();
    var opts = {
        displayMode: fn || 1,
        noalpha: isFlash && /mac/.test(ua) && /firefox/.test(ua)
    };

    $.blockUI.impl.install(window, msg, { width: w, height: h, marginTop: mt, marginLeft: ml }, opts);
};


// override these in your code to change the default messages and styles
$.blockUI.defaults = {
    // the message displayed when blocking the entire page
    pageMessage:    '<h1>Please wait...</h1>',
    // the message displayed when blocking an element
    elementMessage: '', // none
    // styles for the overlay iframe
    overlayCSS:  { backgroundColor: '#fff', opacity: '0.5' },
    // styles for the message when blocking the entire page
    pageMessageCSS:    { width:'250px', margin:'-50px 0 0 -125px', top:'50%', left:'50%', textAlign:'center', color:'#000', backgroundColor:'#fff', border:'3px solid #aaa' },
    // styles for the message when blocking an element
    elementMessageCSS: { width:'250px', padding:'10px', textAlign:'center', backgroundColor:'#fff'},
    // styles for the displayBox
    displayBoxCSS: { width: '400px', height: '400px', top:'50%', left:'50%' },
    // allow body element to be stetched in ie6
    ie6Stretch: 1,
    // supress tab nav from leaving blocking content?
    allowTabToLeave: 0,
    // Title attribute for overlay when using displayBox
    closeMessage: 'Click to close',
    // use fadeOut effect when unblocking (can be overridden on unblock call)
    fadeOut:  1,
    // fadeOut transition time in millis
    fadeTime: 400
};

// the gory details
$.blockUI.impl = {
    box: null,
    boxCallback: null,
    pageBlock: null,
    pageBlockEls: [],
    op8: window.opera && window.opera.version() < 9,
    ie6: $.browser.msie && /MSIE 6.0/.test(navigator.userAgent),
    install: function(el, msg, css, opts) {
        opts = opts || {};
        this.boxCallback = typeof opts.displayMode == 'function' ? opts.displayMode : null;
        this.box = opts.displayMode ? msg : null;
        var full = (el == window);

        // use logical settings for opacity support based on browser but allow overrides via opts arg
        var noalpha = this.op8 || $.browser.mozilla && /Linux/.test(navigator.platform);
        if (typeof opts.alphaOverride != 'undefined')
            noalpha = opts.alphaOverride == 0 ? 1 : 0;

        if (full && this.pageBlock) this.remove(window, {fadeOut:0});
        // check to see if we were only passed the css object (a literal)
        if (msg && typeof msg == 'object' && !msg.jquery && !msg.nodeType) {
            css = msg;
            msg = null;
        }
        msg = msg ? (msg.nodeType ? $(msg) : msg) : full ? $.blockUI.defaults.pageMessage : $.blockUI.defaults.elementMessage;
        if (opts.displayMode)
            var basecss = jQuery.extend({}, $.blockUI.defaults.displayBoxCSS);
        else
            var basecss = jQuery.extend({}, full ? $.blockUI.defaults.pageMessageCSS : $.blockUI.defaults.elementMessageCSS);
        css = jQuery.extend(basecss, css || {});
        var f = ($.browser.msie) ? $('<iframe class="blockUI" style="z-index:1000;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="javascript:false;"></iframe>')
                                 : $('<div class="blockUI" style="display:none"></div>');
        var w = $('<div class="blockUI" style="z-index:1001;cursor:wait;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>');
        var m = full ? $('<div class="blockUI blockMsg" style="z-index:1002;cursor:wait;padding:0;position:fixed"></div>')
                     : $('<div class="blockUI" style="display:none;z-index:1002;cursor:wait;position:absolute"></div>');
        w.css('position', full ? 'fixed' : 'absolute');
        if (msg) m.css(css);
        if (!noalpha) w.css($.blockUI.defaults.overlayCSS);
        if (this.op8) w.css({ width:''+el.clientWidth,height:''+el.clientHeight }); // lame
        if ($.browser.msie) f.css('opacity','0.0');

        $([f[0],w[0],m[0]]).appendTo(full ? 'body' : el);

        // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
        var expr = $.browser.msie && (!$.boxModel || $('object,embed', full ? null : el).length > 0);
        if (this.ie6 || expr) {
            // stretch content area if it's short
            if (full && $.blockUI.defaults.ie6Stretch && $.boxModel)
                $('html,body').css('height','100%');

            // fix ie6 problem when blocked element has a border width
            if ((this.ie6 || !$.boxModel) && !full) {
                var t = this.sz(el,'borderTopWidth'), l = this.sz(el,'borderLeftWidth');
                var fixT = t ? '(0 - '+t+')' : 0;
                var fixL = l ? '(0 - '+l+')' : 0;
            }

            // simulate fixed position
            $.each([f,w,m], function(i,o) {
                var s = o[0].style;
                s.position = 'absolute';
                if (i < 2) {
                    full ? s.setExpression('height','document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + "px"')
                         : s.setExpression('height','this.parentNode.offsetHeight + "px"');
                    full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"')
                         : s.setExpression('width','this.parentNode.offsetWidth + "px"');
                    if (fixL) s.setExpression('left', fixL);
                    if (fixT) s.setExpression('top', fixT);
                }
                else {
                    if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"');
                    s.marginTop = 0;
                }
            });
        }
        if (opts.displayMode) {
            w.css('cursor','default').attr('title', $.blockUI.defaults.closeMessage);
            m.css('cursor','default');
            $([f[0],w[0],m[0]]).removeClass('blockUI').addClass('displayBox');
            $().click($.blockUI.impl.boxHandler).bind('keypress', $.blockUI.impl.boxHandler);
        }
        else
            this.bind(1, el);
        m.append(msg).show();
        if (msg.jquery) msg.show();
        if (opts.displayMode) return;
        if (full) {
            this.pageBlock = m[0];
            this.pageBlockEls = $(':input:enabled:visible',this.pageBlock);
            setTimeout(this.focus, 20);
        }
        else this.center(m[0]);
    },
    remove: function(el, opts) {
        var o = $.extend({}, $.blockUI.defaults, opts);
        this.bind(0, el);
        var full = el == window;
        var els = full ? $('body').children().filter('.blockUI') : $('.blockUI', el);
        if (full) this.pageBlock = this.pageBlockEls = null;

        if (o.fadeOut) {
            els.fadeOut(o.fadeTime, function() {
                if (this.parentNode) this.parentNode.removeChild(this);
            });
        }
        else els.remove();
    },
    boxRemove: function(el) {
        $().unbind('click',$.blockUI.impl.boxHandler).unbind('keypress', $.blockUI.impl.boxHandler);
        if (this.boxCallback)
            this.boxCallback(this.box);
        $('body .displayBox').hide().remove();
    },
    // event handler to suppress keyboard/mouse events when blocking
    handler: function(e) {
        if (e.keyCode && e.keyCode == 9) {
            if ($.blockUI.impl.pageBlock && !$.blockUI.defaults.allowTabToLeave) {
                var els = $.blockUI.impl.pageBlockEls;
                var fwd = !e.shiftKey && e.target == els[els.length-1];
                var back = e.shiftKey && e.target == els[0];
                if (fwd || back) {
                    setTimeout(function(){$.blockUI.impl.focus(back)},10);
                    return false;
                }
            }
        }
        if ($(e.target).parents('div.blockMsg').length > 0)
            return true;
        return $(e.target).parents().children().filter('div.blockUI').length == 0;
    },
    boxHandler: function(e) {
        if ((e.keyCode && e.keyCode == 27) || (e.type == 'click' && $(e.target).parents('div.blockMsg').length == 0))
            $.blockUI.impl.boxRemove();
        return true;
    },
    // bind/unbind the handler
    bind: function(b, el) {
        var full = el == window;
        // don't bother unbinding if there is nothing to unbind
        if (!b && (full && !this.pageBlock || !full && !el.$blocked)) return;
        if (!full) el.$blocked = b;
        var $e = $(el).find('a,:input');
        $.each(['mousedown','mouseup','keydown','keypress','click'], function(i,o) {
            $e[b?'bind':'unbind'](o, $.blockUI.impl.handler);
        });
    },
    focus: function(back) {
        if (!$.blockUI.impl.pageBlockEls) return;
        var e = $.blockUI.impl.pageBlockEls[back===true ? $.blockUI.impl.pageBlockEls.length-1 : 0];
        if (e) e.focus();
    },
    center: function(el) {
		var p = el.parentNode, s = el.style;
        var l = ((p.offsetWidth - el.offsetWidth)/2) - this.sz(p,'borderLeftWidth');
        var t = ((p.offsetHeight - el.offsetHeight)/2) - this.sz(p,'borderTopWidth');
        s.left = l > 0 ? (l+'px') : '0';
        s.top  = t > 0 ? (t+'px') : '0';
    },
    sz: function(el, p) { return parseInt($.css(el,p))||0; }
};

})(jQuery);

/*	These are the GCap XFM bits
*/

$(function() {
	/* External Links */
    $('a.external').click(function(){
        window.open($(this).attr('href'));
        return false;
    });
	/* currently playing ticker */
	//
	var news_ticker = $('#listen div ul');
	var current_show = 0;
	var old_show = 0;
	var headline_count = news_ticker.find('li').size();
	var headline_interval;
	var interval_time = 5000;

	news_ticker.find('li:eq(' + current_show + ')').css('top', '0px');
	headline_interval = setInterval(move_ticker, interval_time);
	function move_ticker() {
		current_show = (old_show + 1) %	headline_count;
		news_ticker.find('li:eq(' + old_show + ')').animate({'top': '-2.5em'}, "slow", function(){
			$(this).css('top','2em');
		});
		news_ticker.find('li:eq(' + current_show + ')').animate({'top': '0px'}, "slow");
		old_show = current_show;
	};
	news_ticker.hover(
		function() {
			clearInterval(headline_interval);
		},
		function(){
			headline_interval = setInterval(move_ticker, interval_time);
			move_ticker();
		}
	);

	/* search form label */
	var search_label = $('#listen form label').text();
	var search_input = $('#listen form input:first');
	search_input.val(search_label);
	search_input.focus(function(){
		if ($(this).val() == search_label) { $(this).val(''); };
	})
	.blur(function(){
		if ($(this).val() == '') { $(this).val(search_label); };
	});
	/* launch player stuff */
	// the class the script is looking for
	var player_class = '.launch_player';
	// function used to open the player
	function openPlayer(url) {
		if (typeof url == 'undefined') url = "http://mediaweb.musicradio.com/player/default.asp?s=69&e=0";
		try {
		    playerWin = window.open(url,'playerWin','width=607,height=558,toolbar=0,location=0,directories=0,status=1,menubar=0,scrollbars=0,resizable=1');
		}
		catch(error) {}
	};
	// looping through each link and assigning the launch function to it
	$(player_class).each(function(){
		$(this).click(function() {
			openPlayer($(this).attr('href'));
			return false;
		});
	});
	/* "Latest Videos" module */
	var latest_videos = ".latest_videos";
	var selected_class = "selected";
	var last_class = "last";
	var unselected_items = "li:not(." + selected_class + ")";
	var selected_items = "li." + selected_class;
	function select_video() {
		/*
		$(this).siblings(selected_items).each(function() {
			$(this).removeClass(selected_class);
			$(this).click(select_video);
		});
		$(this).addClass(selected_class);
		$(this).unbind("click", select_video);
		//  hack forcing IE6 to reflow the list - very dirty, but necessary...
		$(this).parent().toggleClass("gcap_ie_repaint_trigger");
		*/
		var firstItem = $(this).parent().children("li:first");
		var firstItemContents = firstItem.children().remove();
		var selectedItemContents = $(this).children().remove();
		$(this).append(firstItemContents);
		firstItem.append(selectedItemContents);
		return false;
	}
	$(latest_videos).find(unselected_items).click(select_video);
	$(latest_videos).find(selected_items).click(function() {
		openPlayer($(this).find("a").attr("href"));
		return false;
	});
	var login_dialog = $(".user_login").remove();
	if ($.blockUI && login_dialog.length > 0) {
		/* "Login" dialog */
		$.extend($.blockUI.defaults.pageMessageCSS, {
			width: "358px",
			margin: "-130px 0 0 -178px",
			border: "none"
		});
		$.extend($.blockUI.defaults.overlayCSS, {
			backgroundColor: "#4d401f",
			opacity: "0.6"
		});
		login_dialog.find("button.cancel").click(function() {
			$.unblockUI();
		});
		var login_link = ".login a";
		$(login_link).each(function() {
			$(this).click(function() {
				$.blockUI(login_dialog);
				return false;
			});
		});
		/*
		var region_picker = $("#region_picker li:eq(1) ul").clone(true);
		var login_region_picker = login_dialog.find(".region_picker");
		login_region_picker.append(region_picker);
		login_region_picker.click(function() {
			$(this).parent().toggleClass('expanded');
			return false;
		});
		var login_region = login_dialog.find("#loginRegion");
		var login_region_field = login_dialog.find("#loginRegionField");
		var regions = region_picker.find("li a");
		regions.click(function() {
			var value = $(this).text();
			login_region.text(value);
			login_region_field.val(value);
		});
		*/
	}
	
	function galModule_init(){
		
		/*-------------*/
		// Classes
		var sGalHideClass 		= "hide_gal";
		var sGalButPrev 		= "gal_prev";
		var sGalButNext 		= "gal_next";
		var sGalButPrevDis		= "gal_prev_disabled";
		var sGalButNextDis		= "gal_next_disabled";
		
		// Variables and Selectors
		var nGalCurrentPage = 0;
		var nGalNextPage;
		var gallery_mod = $('.gallery');
		/*-------------*/
		
		//Add in the buttons
		gallery_mod.find('h2').after('<button class="' + sGalButPrev + '" alt="Previous Images" />');
		gallery_mod.find('ul').after('<button class="' + sGalButNext + '" alt="Next Images" />');
		
		gallery_mod.find('.' + sGalButPrev).attr("disabled","disabled");
		gallery_mod.find('.' + sGalButPrev).addClass(sGalButPrevDis);
		
		// how many images are there
		var nNumImgs = gallery_mod.find('li').length;
		
		// Rewrite the HTML in the UL to arrange it into panels
		var sNewHtml = "";
		sNewHtml += "<li>\n\t<ul>\n";
		for(var i=0; i<nNumImgs; i++)
		{
			sNewHtml += "\t\t<li>\n";
			sNewHtml += "\t\t\t" + gallery_mod.find('ul.gal_imgs li:eq(' + i + ')').html() + "\n";
			sNewHtml += "\t\t</li>\n";	
			if(i%4 == 3)
			{
				sNewHtml += "\t</ul>\n";
				sNewHtml += "</li>\n";
				if(i != (nNumImgs-1))
				{
					sNewHtml += "<li>\n";
					sNewHtml += "\t<ul>\n";
				};
			};
		};
		sNewHtml += "\t</ul>\n</li>";
		gallery_mod.find('ul.gal_imgs').html(sNewHtml);
		
		// Hide all but the first panel
		gallery_mod.find('.gal_imgs > li').addClass(sGalHideClass);
		gallery_mod.find('.gal_imgs > li:eq(0)').removeClass(sGalHideClass);
		
		// how many panels are there?
		var nNumPages = (gallery_mod.find('ul li ul').length - 1);
		
		
		//Set the first li from .show to .current
		gallery_mod.find('ul.gal_imgs li:not(.hide_gal) li:first').addClass('current');
		
		//Get the Title and copy from the .current and display below gallery
		var	sTitle 	= gallery_mod.find('li:first .copy .title').html();
		var sDetails 	= gallery_mod.find('li:first .copy .details').html();
		
		// Create the Title and Details elements below the gallery
		gallery_mod.find('.' + sGalButNext).after('<p class="img_details">' + sDetails + '</p>')
		gallery_mod.find('.' + sGalButNext).after('<p class="img_title">' + sTitle + '</p>');
		
		// Set the "hovered" image details at the bottom and set class of .current
		gallery_mod.find('.gal_imgs ul li').hover(
			function(){
				gallery_mod.find('.gal_imgs > li:not(.hide_gal) li.current').removeClass('current');		
				gallery_mod.find('p.img_title').text($(this).find('.copy .title').text());
				gallery_mod.find('p.img_details').text($(this).find('.copy .details').text());
			},
			function(){
				gallery_mod.find('.gal_imgs > li:not(.hide_gal) li:first').addClass('current');		
				gallery_mod.find('p.img_title').text(gallery_mod.find('ul.gal_imgs li:not(.hide_gal) li:first .copy .title').text());
				gallery_mod.find('p.img_details').text(gallery_mod.find('ul.gal_imgs li:not(.hide_gal) li:first .copy .details').text());
			}
		);
		
		
		// Set the Click Event on the Next Button
		gallery_mod.find('.' + sGalButNext).click(
			function()
			{
				nGalNextPage = nGalCurrentPage + 1;
				
				if(nGalNextPage <= (nNumPages + 1)){
					gallery_mod.find('.' + sGalButPrev).attr("disabled","");
					gallery_mod.find('.' + sGalButPrev).removeClass(sGalButPrevDis);
					togglePanels();
					
					if(nGalCurrentPage == nNumPages)
					{
						gallery_mod.find('.' + sGalButNext).attr("disabled","disabled");
						gallery_mod.find('.' + sGalButNext).addClass(sGalButNextDis);
					};
				};
			}
		);
		
		// Set the Click Event on the Previous Button
		gallery_mod.find('.' + sGalButPrev).click(
			function()
			{
				nGalNextPage = nGalCurrentPage - 1;
				
				if(nGalNextPage >= 0){	
					gallery_mod.find('.' + sGalButNext).attr("disabled","");
					gallery_mod.find('.' + sGalButNext).removeClass(sGalButNextDis);
					togglePanels();
					
					if(nGalCurrentPage == 0)
					{
						gallery_mod.find('.' + sGalButPrev).attr("disabled","disabled");
						gallery_mod.find('.' + sGalButPrev).addClass(sGalButPrevDis);
					};
				};
			}
		);
		
		// Toggle between the available gallery panels and set the text
		function togglePanels(){
			// Hide all the panels and show the next panel
			gallery_mod.find('.gal_imgs > li:eq(' + nGalCurrentPage + ')').addClass(sGalHideClass);
			gallery_mod.find('.gal_imgs > li:eq(' + nGalNextPage + ')').removeClass(sGalHideClass);
			
			// Set the title and details to the first of the new panel
			gallery_mod.find('ul.gal_imgs li:not(.hide_gal) li:first').addClass('current');
			gallery_mod.find('p.img_title').text(gallery_mod.find('ul.gal_imgs li:not(.hide_gal) li:first .copy .title').text());
			gallery_mod.find('p.img_details').text(gallery_mod.find('ul.gal_imgs li:not(.hide_gal) li:first .copy .details').text());
			
			nGalCurrentPage = nGalNextPage;
		};
	};

	galModule_init();
});
