/**************************************************************************************/
/******************************* thefix.common.js *************************************/
/**************************************************************************************/
if (!window.TheFix) {
    window.TheFix = {};
}

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, "");
};

// set this to ensure IE8 doesn't try and cache ajax results
$.ajaxSetup({
    cache: false
});

// <summary>
// TheFix Config class
// </summary>
TheFix.Config = new function() {
    var me = this;
    me.LoggingEnabled = false;
    me.Mode = "debug";
    // service framework url's
    me.ServiceBasePath = "http://data.devprev.ninemsn.com.au/Services/Service.axd?";

    // common
    me.RegionListUrl = "/ajax/common/List.aspx";
    // tvfix mini guide
    me.MiniGridTabUrl = "/ajax/tvfix/Mini.aspx";
    // moviefix times
    me.MovieTimesTabUrl = "/ajax/moviefix/Tab.aspx";
    // gigs
    me.LatestGigsUrl = "/ajax/guides/LatestGigs.aspx";
    // latest rest lists
    me.LatestRestListUrl = "/ajax/guides/LatestRestaurantList.aspx";
    // latest bars lists
    me.LatestBarListUrl = "/ajax/guides/LatestBarList.aspx";
    // cookie defaults
    me.GuideSettingsCookie = "TheFixTvGuide";
    me.MovieSettingsCookie = "TheFixMovieTimes";
    me.YourTimeLocationCookie = "YourTimeLoc";
    me.CookieExpiryDays = 30;
};

// <summary>
// TheFix Utility class
// </summary>
TheFix.Util = new function() {
    var me = this;

    this.Log = function(obj) {
        if (!TheFix.Config.LoggingEnabled) return;

        if (typeof console != "undefined") {
            console.log(obj);
        }
    };

    this.EventPopup = function(e) {
        var ref = $(this).attr("href");
        var mywindow = window.open(
	                ref,
	                'margin',
	                'toolbar=no,location=yes,directories=no,menubar=no,scrollbars=yes,status=no,resizable=yes,width=750,height=560'
                );
        mywindow.focus();
        return false;
    };

    this.Unescape = function(str) {
        str = "" + str;
        while (true) {
            var i = str.indexOf('+');
            if (i < 0)
                break;
            str = str.substring(0, i) + '%20' +
			str.substring(i + 1, str.length);
        }
        return unescape(str);
    };

    this.Shorten = function(text, len) {
        text = text.trim();
        if (text.length > len + 1) {
            return '<span title=\"' + text + '\">' + text.substring(0, len) + '...</span>';
        } else {
            return text;
        }
    };

};






/**************************************************************************************/
/******************************* tvfix.module.js **************************************/
/**************************************************************************************/
if (!window.TvFix) {
    window.TvFix = {};
}

// <summary>
// TvFix Grid functions
// </summary>
TvFix.MiniGrid = new function() {
    var me = this;
    var tabLoaded = [false, false];
    var regionsLoaded = false;

    this.Init = function() {
        var config = {
            sensitivity: 3, // number = sensitivity threshold (must be 1 or higher)
            interval: 200, // number = milliseconds for onMouseOver polling interval
            over: showRegions, // function = onMouseOver callback (REQUIRED)    
            timeout: 500, // number = milliseconds delay before onMouseOut
            out: hideRegions // function = onMouseOut callback (REQUIRED)
        };

        $("#mini-grid .pname a").live('click', TheFix.Util.EventPopup);
        $("#mini-grid ul.grid-tabs li").click(tabClick)
        $("#mini-grid li#tonight-tab").click(); // init first tab
        $("#mini-grid .grid-region li").hoverIntent(config);
        $("#mini-grid #region-id-list a").live('click', changeRegion);
    };

    function showRegions() {
        if (regionsLoaded) {
            $(this).find(">.placeholder").show();
        } else {
            $(this).find(">.placeholder").show().load(TheFix.Config.RegionListUrl + "?site=tvfix");
            regionsLoaded = true;
        }
    }

    function changeRegion(e) {
        var url = $(this).attr("href");
        var q = url.split('?')[1];
        var p = q.split('/');
        var state = TheFix.Util.Unescape(p[0]).trim();
        var region_label = TheFix.Util.Unescape(p[1]);
        $("#mini-grid .region-label").html(TheFix.Util.Shorten(region_label, 16)); // update regions label/s
        var region_id = p[2];
        setCookieRegion(state, region_id);
        tabLoaded[0] = tabLoaded[1] = false;
        $("#mini-grid li#tonight-tab").click();
        $("#mini-grid .grid-region li >.placeholder").hide();
        return false;
    }

    function setCookieRegion(state, region) {
        var cookie = $.cookie(TheFix.Config.GuideSettingsCookie);
        cookie["State"] = state.toUpperCase();
        cookie["Regions"] = region;
        $.cookie(TheFix.Config.GuideSettingsCookie, cookie, { expires: TheFix.Config.CookieExpiryDays, path: "/" });
    }

    function hideRegions() {
        $(this).find(">.placeholder").hide();
    }

    function tabClick() {
        log('tabClick');
        // clear currently selected
        var sUrl = null;
        var p = $(this).parent("ul");
        p.children("li").removeClass("selected");

        // show loading??
        log(this.id);
        switch (this.id) {
            case "tonight-tab":
                if (!tabLoaded[0]) {
                    sUrl = TheFix.Config.MiniGridTabUrl + "?period=peak";
                    $("#mini-grid #tonight-content").load(sUrl);
                    $("#mini-grid #nownext-content").hide();
                    $("#mini-grid #tonight-content").show();
                    tabLoaded[0] = true;
                } else {
                    $("#mini-grid #nownext-content").hide();
                    $("#mini-grid #tonight-content").show();
                }
                break;
            case "nownext-tab":
                if (!tabLoaded[1]) {
                    sUrl = TheFix.Config.MiniGridTabUrl + "?period=nownext";
                    $("#mini-grid #nownext-content").load(sUrl);
                    $("#mini-grid #tonight-content").hide();
                    $("#mini-grid #nownext-content").show();
                    tabLoaded[1] = true;
                } else {
                    $("#mini-grid #tonight-content").hide();
                    $("#mini-grid #nownext-content").show();
                }
                break;
        }

        $(this).addClass("selected");
    }

    function log(val) {
        TheFix.Util.Log(val);
    }

}



/**************************************************************************************/
/******************************* guides.module.js *************************************/
/**************************************************************************************/
if (!window.YourTime) {
    window.YourTime = {};
}

// <summary>
// TvFix Grid functions
// </summary>
YourTime.Guides = new function() {
    var me = this;
    var tabLoaded = [false, false, false];
    var regionsLoaded = false;

    this.Init = function() {

        var config = {
            sensitivity: 3, // number = sensitivity threshold (must be 1 or higher)
            interval: 200, // number = milliseconds for onMouseOver polling interval
            over: showRegions, // function = onMouseOver callback (REQUIRED)    
            timeout: 500, // number = milliseconds delay before onMouseOut
            out: hideRegions // function = onMouseOut callback (REQUIRED)
        };

        $("#guide-events ul.tabs li").click(tabClick)
        $("#guide-events li#rest-tab").click(); // init first tab
        $("#guide-events .guide-region li").hoverIntent(config);
        $("#guide-events #region-id-list a").live('click', changeRegion);

    };

    function showRegions() {
        if (regionsLoaded) {
            $(this).find(">.placeholder").show();
        } else {
            $(this).find(">.placeholder").show().load(TheFix.Config.RegionListUrl + "?site=other");
            regionsLoaded = true;
        }
    }

    function changeRegion(e) {
        var url = $(this).attr("href");
        var q = url.split('?')[1];
        var p = q.split('/');
        var state = TheFix.Util.Unescape(p[0]).trim();
        var region_label = TheFix.Util.Unescape(p[1]);
        $("#guide-events .region-label").html(TheFix.Util.Shorten(region_label, 16)); // update regions label/s
        var region_id = p[2];
        setCookieRegion(state, region_id, region_label);
        tabLoaded[0] = tabLoaded[1] = tabLoaded[2] = false;
        $("#guide-events li#rest-tab").click();
        $("#guide-events .guide-region li >.placeholder").hide();
        return false;
    }

    function setCookieRegion(state, regionId, regionLabel) {
        var cookie = $.cookie(TheFix.Config.YourTimeLocationCookie);
        cookie["State"] = state.toUpperCase();
        cookie["RegionId"] = regionId; // TODO: Do we need to set state/region label etc?
        cookie["Region"] = regionLabel;
        $.cookie(TheFix.Config.YourTimeLocationCookie, cookie, { expires: TheFix.Config.CookieExpiryDays, path: "/" });
    }

    function hideRegions() {
        $(this).find(">.placeholder").hide();
    }

    function tabClick() {
        log('tabClick');
        // clear currently selected
        var sUrl = null;
        var p = $(this).parent("ul");
        p.children("li").removeClass("selected");

        log(this);

        // show loading??
        log(this.id);
        switch (this.id) {
            case "rest-tab":
                if (!tabLoaded[0]) {
                    sUrl = TheFix.Config.LatestRestListUrl + "?guide=rest";
                    $("#guide-events #rest-content").load(sUrl);
                    $("#guide-events #bars-content, #guide-events #gigs-content").hide();
                    $("#guide-events #rest-content").show();
                    tabLoaded[0] = true;
                } else {
                    $("#guide-events #bars-content, #guide-events #gigs-content").hide();
                    $("#guide-events #rest-content").show();
                }
                break;
            case "bars-tab":
                if (!tabLoaded[1]) {
                    sUrl = TheFix.Config.LatestBarListUrl + "?guide=bars";
                    $("#guide-events #bars-content").load(sUrl);
                    $("#guide-events #rest-content, #guide-events #gigs-content").hide();
                    $("#guide-events #bars-content").show();
                    tabLoaded[1] = true;
                } else {
                    $("#guide-events #rest-content, #guide-events #gigs-content").hide();
                    $("#guide-events #bars-content").show();
                }
                break;
            case "gigs-tab":
                if (!tabLoaded[2]) {
                    sUrl = TheFix.Config.LatestGigsUrl;
                    $("#guide-events #gigs-content").load(sUrl);
                    $("#guide-events #rest-content, #guide-events #bars-content").hide();
                    $("#guide-events #gigs-content").show();
                    tabLoaded[2] = true;
                } else {
                    $("#guide-events #rest-content, #guide-events #bars-content").hide();
                    $("#guide-events #gigs-content").show();
                }
                break;
        }

        $(this).addClass("selected");
    }

    function log(val) {
        TheFix.Util.Log(val);
    }

}


/**************************************************************************************/
/******************************* moviefix.module.js ***********************************/
/**************************************************************************************/
if (!window.MovieFix) {
    window.MovieFix = {};
}

// <summary>
// TvFix Grid functions
// </summary>
MovieFix.MovieTimes = new function() {
    var me = this;
    var tabLoaded = [false, false];
    var regionsLoaded = false;

    this.Init = function() {

        var config = {
            sensitivity: 3, // number = sensitivity threshold (must be 1 or higher)
            interval: 200, // number = milliseconds for onMouseOver polling interval
            over: showRegions, // function = onMouseOver callback (REQUIRED)    
            timeout: 500, // number = milliseconds delay before onMouseOut
            out: hideRegions // function = onMouseOut callback (REQUIRED)
        };

        //$(".pname a").live('click', TheFix.Util.EventPopup);
        $("#movie-times ul.tabs li").click(tabClick)
        $("#movie-times li#title-tab").click(); // init first tab
        $("#movie-times .cinema-region li").hoverIntent(config);
        $("#movie-times #region-id-list a").live('click', changeRegion);

        $("#movie-times .title-popup").live('mouseover', function(e) { $(this).hide().unbind(); });

        //$("#movie-times #title-content li").live('mouseover', titleHover);
        //$("#movie-times #title-content li").live('mouseout', titleHover);

    };

    function titleHover(e) {
        log(e.type);
        if (e.type == 'mouseover') {
            // do something on mouseover
            $(this).addClass("hover");
        } else {
            // do something on mouseout
            $(this).removeClass("hover");
        }

    }

    function showRegions() {
        if (regionsLoaded) {
            $(this).find(">.placeholder").show();
        } else {
            $(this).find(">.placeholder").show().load(TheFix.Config.RegionListUrl + "?site=moviefix");
            regionsLoaded = true;
        }
    }

    function changeRegion(e) {
        var url = $(this).attr("href");
        var q = url.split('?')[1];
        var p = q.split('/');
        var state = TheFix.Util.Unescape(p[0]).trim();
        var region_label = TheFix.Util.Unescape(p[1]);
        $("#movie-times .region-label").html(TheFix.Util.Shorten(region_label, 16)); // update regions label/s
        var region_id = p[2];
        setCookieRegion(state, region_id, region_label);
        tabLoaded[0] = tabLoaded[1] = false;
        $("#movie-times li#title-tab").click();
        $("#movie-times .cinema-region li >.placeholder").hide();
        return false;
    }

    function setCookieRegion(state, regionId, regionLabel) {
        var cookie = $.cookie(TheFix.Config.MovieSettingsCookie);
        cookie["State"] = state.toUpperCase();
        cookie["RegionId"] = regionId; // TODO: Do we need to set state/region label etc?
        cookie["Region"] = regionLabel;
        $.cookie(TheFix.Config.MovieSettingsCookie, cookie, { expires: TheFix.Config.CookieExpiryDays, path: "/" });
    }

    function hideRegions() {
        $(this).find(">.placeholder").hide();
    }

    function showImage(e) {
        // ignore if no popup exists
        if ($(this).find(".title-popup").length == 0) return;
        var offset = 9; // arrow offset
        var left = e.pageX - offset;
        var pop = $(this).find(".title-popup");

        var gutterOffset = ($(window).width() - 970) / 2;

        pop.css("left", e.pageX - gutterOffset - offset);
        pop.addClass("title-popup-top").fadeIn();

        // update popup position
        $(this).mousemove(function(e) {
            left = e.pageX - offset;
            pop.css("left", e.pageX - gutterOffset - offset);
        });
    }

    function hideImage(e) {
        $(this).find(".title-popup").hide().unbind();
    }

    function tabClick() {
        log('tabClick');
        // clear currently selected
        var sUrl = null;
        var p = $(this).parent("ul");
        p.children("li").removeClass("selected");

        // show loading??
        switch (this.id) {
            case "title-tab":
                if (!tabLoaded[0]) {
                    sUrl = TheFix.Config.MovieTimesTabUrl + "?tab=movies";


                    $("#movie-times #title-content").load(sUrl, function() {

                        var config2 = {
                            sensitivity: 3, // number = sensitivity threshold (must be 1 or higher)
                            interval: 2, // number = milliseconds for onMouseOver polling interval
                            over: showImage, // function = onMouseOver callback (REQUIRED)    
                            timeout: 0, // number = milliseconds delay before onMouseOut
                            out: hideImage // function = onMouseOut callback (REQUIRED)
                        };
                        $("#movie-times #title-content li").hoverIntent(config2);

                    });

                    $("#movie-times #cinema-content").hide();
                    $("#movie-times #title-content").show();
                    tabLoaded[0] = true;




                } else {
                    $("#cinema-content").hide();
                    $("#title-content").show();
                }
                break;
            case "cinema-tab":
                if (!tabLoaded[1]) {
                    sUrl = TheFix.Config.MovieTimesTabUrl + "?tab=cinemas";
                    $("#movie-times #cinema-content").load(sUrl);
                    $("#movie-times #title-content").hide();
                    $("#movie-times #cinema-content").show();
                    tabLoaded[1] = true;
                } else {
                    $("#movie-times #title-content").hide();
                    $("#movie-times #cinema-content").show();
                }
                break;
        }

        $(this).addClass("selected");
    }

    function log(val) {
        TheFix.Util.Log(val);
    }

}

