/*11374 Tuesday, 4 October 2011 10:18 AM*/


/* ---------------------------------------------------------------------------------------- */
/* MO-VIDEO API SETTINGS
/* ---------------------------------------------------------------------------------------- */
var videoSettings = new Object();

/* Account Settings */
videoSettings.appName = "junior-masterchef";
videoSettings.flashAppName = "masterchef-universal-flash"; // for universal player
videoSettings.ipadAppName = "masterchef-universal-ipad"; // for universal player
videoSettings.apiKey = "movideoMasterChef";

/* URL Settings */
videoSettings.videoPageURL = "/video.htm";

/* Omniture Settings */
videoSettings.omnitureAccount = "nwtchef";
videoSettings.omnitureGlobalSuite = "nwtglobal";
videoSettings.omniutreSuite = "networkten";

/* VAST Settings */
videoSettings.vastSite = "tendigital";
videoSettings.vastPlayer = "masterchef";
videoSettings.vastMediaTag = "";
videoSettings.vastReplaceToken = "mediaPath";

/* General Settings */
videoSettings.mediaParam = "movideo_m";
videoSettings.playlistParam = "movideo_p";
videoSettings.apiUrl = "/api/rest/";

videoSettings.jsonp = true;

/* ---------------------------------------------------------------------------------------- */
/* FUNCTIONS FOR AD SERVING AND OMNITURE ANALYTICS v2.2
/* Updated: Resolved issue in IE/Masterchef Recipe pages
/* Updated: Added support for multiple ads in one call
/* ---------------------------------------------------------------------------------------- */
var politeAdLoad = true;

function setStrOSC(scBreadCrumb){
    scBreadCrumb = scBreadCrumb.replace(/\&/gi,"and"); 
    scBreadCrumb = scBreadCrumb.replace(/'/gi,""); 
    scBreadCrumb = scBreadCrumb.replace(/`/gi,""); 
    scBreadCrumb = scBreadCrumb.replace(/rsquo;/gi,""); 
    scBreadCrumb = scBreadCrumb.replace(/lsquo;/gi,""); 
    scBreadCrumb = scBreadCrumb.replace(/rdquo;/gi,""); 
    scBreadCrumb = scBreadCrumb.replace(/ldquo;/gi,"");
    var scBreadCrumbArray = scBreadCrumb.split("|"); 
    var scHBXMLC = ''; 
    for (x in scBreadCrumbArray)
    {
        scBreadCrumbValue = new String(scBreadCrumbArray[x]); 
        scBreadCrumbValue = scBreadCrumbValue.substring(scBreadCrumbValue.indexOf(">") + 1); 
        scBreadCrumbValue = scBreadCrumbValue.substring(0, scBreadCrumbValue.indexOf("<")); 
        scHBXMLC = scHBXMLC + '/' + scBreadCrumbValue;
    } 
    var oscCn = scHBXMLC; 
    //alert("oscCn: " + scHBXMLC); 
    strOSC = oscCn.toLowerCase(); 
    // remove /home from breadcrumb so top level sections exist 
    if (strOSC.length > 5)
    {
        strOSC = strOSC.replace(/\/home\//g,"/"); 
    } 
    // remove bad characters 
    strOSC = strOSC.replace(/&amp;/gi,"and"); 
    strOSC = strOSC.replace(/rsquo;/gi,""); 
    strOSC = strOSC.replace(/lsquo;/gi,""); 
    strOSC = strOSC.replace(/rdquo;/gi,""); 
    strOSC = strOSC.replace(/ldquo;/gi,""); 
    strOSC = strOSC.replace(/\nbsp/gi,""); 
    //strOSC = strOSC.replace(/\ /gi," "); 
    strOSC = strOSC.replace(/[',`,;,\&,\?,\#,\!,\$,\%,\^,\@,\*,.,\,]/gi,"");
    
    return strOSC;
}
function setsHBXMLC(sBreadCrumb, sHBXMLC){
    sBreadCrumb = sBreadCrumb.replace(/\&/gi,"and");
    sBreadCrumb = sBreadCrumb.replace(/'/gi,"");
    sBreadCrumb = sBreadCrumb.replace(/`/gi,"");
    sBreadCrumb = sBreadCrumb.replace(/rsquo;/gi,"");
    sBreadCrumb = sBreadCrumb.replace(/lsquo;/gi,"");
    sBreadCrumb = sBreadCrumb.replace(/rdquo;/gi,"");
    sBreadCrumb = sBreadCrumb.replace(/ldquo;/gi,"");
    var sBreadCrumbArray = sBreadCrumb.split("|");
    for (x in sBreadCrumbArray) {
        sBreadCrumbValue = new String(sBreadCrumbArray[x]);
        sBreadCrumbValue = sBreadCrumbValue.substring(sBreadCrumbValue.indexOf(">") + 1);
        sBreadCrumbValue = sBreadCrumbValue.substring(0, sBreadCrumbValue.indexOf("<"));
        sHBXMLC = sHBXMLC + '/' + sBreadCrumbValue;
    }
    var xstrHBXMLCn = sHBXMLC; 
    var xstrHBXMLC = xstrHBXMLCn.toLowerCase(); 
    // remove /home from breadcrumb 
    if (xstrHBXMLC.length > 5)
    {
        xstrHBXMLC = xstrHBXMLC.replace(/\/home\//g,"/"); 
    }
    // remove bad characters 
    xstrHBXMLC = xstrHBXMLC.replace(/&amp;/gi,"and"); 
    xstrHBXMLC = xstrHBXMLC.replace(/rsquo;/gi,""); 
    xstrHBXMLC = xstrHBXMLC.replace(/lsquo;/gi,""); 
    xstrHBXMLC = xstrHBXMLC.replace(/rdquo;/gi,""); 
    xstrHBXMLC = xstrHBXMLC.replace(/ldquo;/gi,""); 
    xstrHBXMLC = xstrHBXMLC.replace(/\nbsp/gi,""); 
    xstrHBXMLC = xstrHBXMLC.replace(/\ /gi," "); 
    xstrHBXMLC = xstrHBXMLC.replace(/[',`,;,\&,\?,\#,\!,\$,\%,\^,\@,\*,.,\,]/gi,""); 
    xstrHBXMLC = xstrHBXMLC.replace(/[^a-zA-Z\d/]/gi,"");        
    
    return xstrHBXMLC;
}
function encodeName(strEnc){
    strEnc = strEnc.replace(/<[^>]+>/g, ""); 
    strEnc = strEnc.replace(/&amp;/gi,"and"); 
    strEnc = strEnc.replace(/^\//g, ""); 
    strEnc = strEnc.replace(/&quot;/gi,""); 
    strEnc = strEnc.replace(/&acute;/gi,""); 
    strEnc = strEnc.replace(/[',`,;,\&,\?,\#,\!,\$,\%,\^,\@,\*,.,\,]/gi,""); 
    strEnc = strEnc.replace(/rsquo;/gi,""); 
    strEnc = strEnc.replace(/lsquo;/gi,""); 
    strEnc = strEnc.replace(/rdquo;/gi,""); 
    strEnc = strEnc.replace(/ldquo;/gi,""); 
    return strEnc; 
}
/*
function DisplayAds(positionList, position, width, height){
    var oaspage= sitepage + '/1' + RNS + '@' + positionList + '!' + position + '?' + OAS_query; 
           
    OAS_version = 11;
    if ((navigator.userAgent.indexOf('Mozilla/3') != -1) || (navigator.userAgent.indexOf('Mozilla/4.0 WebTV') != -1))
    OAS_version = 10;
    if (OAS_version < 11){
        document.write ('<a href="' + oas + 'click_nx.ads/' + oaspage + '" target="_top" ><img src="' + oas + 'adstream_nx.ads/' + oaspage + '" border="0" width="' + width + '" height="' + height + '"></a>'); 
    } else { 
        document.write ('<script type="text/javascript" src="' + oas + 'adstream_jx.ads/' + oaspage + '">'); 
        document.write('<\/script>'); 
    } 
    document.close(); 
}
*/
function GetOSCPath(oas_sitepage){
    //Get the full path including final page name
    var scPageName = sPageName
    var scBreadCrumb = sBreadCrumb
    strOSC = setStrOSC(scBreadCrumb);
    // return OSC string 
    strOSC = oas_sitepage + strOSC; 
    return(strOSC); 
}
function GetSectionPath(intlevel,oas_sitepage){
    //display path taken from GetOSCPath with number of intlevels deep to populate sub sections
    var strOSCPath = GetOSCPath(oas_sitepage);
    var scCrumbArray = strOSCPath.split("/"); 
    var scOSCMLC = ''; 
    
    for (x in scCrumbArray){
        scCrumbValue = new String(scCrumbArray[x]); 
        if (x <= (scCrumbArray.length) && x <= intlevel){
            if (scOSCMLC==''){
                scOSCMLC = scCrumbValue;
            }else{
                scOSCMLC = scOSCMLC + '/' + scCrumbValue;
            }
        }
    } 
    return(scOSCMLC);
}
/* ---------------------------------------------------------------------------------------- */
/* START: NEW DISPLAY-ADS FUNCTION
/* ---------------------------------------------------------------------------------------- */
var adCounter = 0;
var adPositions = [
    { positionList: 'Top', position: 'Top', adType: 'iframe' },
    { positionList: 'Middle', position: 'Middle', adType: 'iframe' },
    { positionList: 'x55,x56,x57,x58', position: 'x55', adType: 'ajax' },
    { positionList: 'x55,x56,x57,x58', position: 'x56', adType: 'ajax' },
    { positionList: 'x55,x56,x57,x58', position: 'x57', adType: 'ajax' },
    { positionList: 'x55,x56,x57,x58', position: 'x58', adType: 'ajax' },
    { positionList: 'x01,x02,x03,x04', position: 'x01', adType: 'ajax' },
    { positionList: 'x01,x02,x03,x04', position: 'x02', adType: 'ajax' },
    { positionList: 'x01,x02,x03,x04', position: 'x03', adType: 'ajax' },
    { positionList: 'x01,x02,x03,x04', position: 'x04', adType: 'ajax' },
    { positionList: 'x60,x61,x62', position: 'x60', adType: 'ajax' },
    { positionList: 'x60,x61,x62', position: 'x61', adType: 'ajax' },
    { positionList: 'x60,x61,x62', position: 'x62', adType: 'ajax' },
    { positionList: 'x01,x02,x03,x04', position: '', adType: 'standard' },
    { positionList: 'x55,x56,x57,x58', position: '', adType: 'standard' },
    { positionList: 'x60,x61,x62', position: '', adType: 'iframe' }    
];
if (location.href.indexOf('smartload=false') > -1) {
    adPositions = false;
}
if (typeof (window['politeAdLoad']) != "undefined") {
    if (politeAdLoad == false) {
        adPositions = false;
    }    
}
function getAdType(positionList, position) {
    try {
        for (i=0; i<adPositions.length; i++) {
            if (positionList == adPositions[i].positionList && position == adPositions[i].position) {
                return adPositions[i].adType;
            }
        }    
    }
    catch(e) { return 'standard'; }
    return 'standard';
}
function DisplayAds(positionList, position, width, height) {
    
    adCounter++;
    var adType = getAdType(positionList, position);
    // OAS version
    var OAS_version = 11;
    if ((navigator.userAgent.indexOf('Mozilla/3') != -1) || (navigator.userAgent.indexOf('Mozilla/4.0 WebTV') != -1)) { OAS_version = 10; }
    // create url
    var oaspage = sitepage + '/1' + RNS + '@' + positionList + '!' + position + '?' + OAS_query; 
           
    // if older browser, show image version
    if (OAS_version < 11) {
        document.write ('<a href="' + oas + 'click_nx.ads/' + oaspage + '" target="_top" ><img src="' + oas + 'adstream_nx.ads/' + oaspage + '" border="0" width="' + width + '" height="' + height + '"></a>'); 
    }
    else { 
        // AJAX
        if (adType == 'ajax') {
            var adName = 'ad_' + adCounter;
            var div = '<div id="'+adName+'" data="'+positionList+';'+position+';'+width+';'+height+'"></div>';
            document.write(div);
            document.close();
            var url = oas + 'adstream_sx.ads/' + oaspage;
            
            // replace oascentral path with proxy pass path
            url = url.replace('http://oascentral.ten.com.au/', '/oascentral/');
            url = url.replace('http://oascentral.neighbours.com.au/', '/oascentral/');
            $.ajax({
                url: url,
                dataType: "text",
                async: true,
                context: adName,
                success: function (txt) {
                    document.getElementById(this).innerHTML = txt;
                }
            });
        }
        // IFRAME
        else if (adType == 'iframe') {
            var frameId = 'advertisement_iframe_'+adCounter;
            var url = oas + 'adstream_jx.ads/' + oaspage;
            var proxyUrl = '/advertisement-iframe.htm' + "?ad=" + frameId + "&uri=" + encodeURIComponent(url);                
            document.write('<iframe id="'+frameId+'" width="'+width+'" height="' + height + '" frameborder="0" scrolling="no"></iframe>');
            document.getElementById(frameId).src = proxyUrl;
            document.close();
        }   
        // STANDARD DOCUMENT.WRITE
        else {
            document.write ('<script type="text/javascript" src="' + oas + 'adstream_jx.ads/' + oaspage + '">'); 
            document.write('<\/script>'); 
            document.close(); 
        }
    }
}
/* ---------------------------------------------------------------------------------------- */
/* END: NEW DISPLAY-ADS FUNCTION
/* ---------------------------------------------------------------------------------------- *//*
 * jQuery Tooltip plugin 1.3
 *
 * http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/
 * http://docs.jquery.com/Plugins/Tooltip
 *
 * Copyright (c) 2006 - 2008 Jörn Zaefferer
 *
 * $Id: jquery.tooltip.js 5741 2008-06-21 15:22:16Z joern.zaefferer $
 * 
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */
 
;(function($) {
    
        // the tooltip element
    var helper = {},
        // the current tooltipped element
        current,
        // the title of the current element, used for restoring
        title,
        // timeout id for delayed tooltips
        tID,
        // IE 5.5 or 6
        IE = $.browser.msie && /MSIE\s(5\.5|6\.)/.test(navigator.userAgent),
        // flag for mouse tracking
        track = false;
    
    $.tooltip = {
        blocked: false,
        defaults: {
            delay: 200,
            fade: false,
            showURL: true,
            extraClass: "",
            top: 15,
            left: 15,
            id: "tooltip"
        },
        block: function() {
            $.tooltip.blocked = !$.tooltip.blocked;
        }
    };
    
    $.fn.extend({
        tooltip: function(settings) {
            settings = $.extend({}, $.tooltip.defaults, settings);
            createHelper(settings);
            return this.each(function() {
                    $.data(this, "tooltip", settings);
                    this.tOpacity = helper.parent.css("opacity");
                    // copy tooltip into its own expando and remove the title
                    this.tooltipText = this.title;
                    $(this).removeAttr("title");
                    // also remove alt attribute to prevent default tooltip in IE
                    this.alt = "";
                })
                .mouseover(save)
                .mouseout(hide)
                .click(hide);
        },
        fixPNG: IE ? function() {
            return this.each(function () {
                var image = $(this).css('backgroundImage');
                if (image.match(/^url\(["']?(.*\.png)["']?\)$/i)) {
                    image = RegExp.$1;
                    $(this).css({
                        'backgroundImage': 'none',
                        'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
                    }).each(function () {
                        var position = $(this).css('position');
                        if (position != 'absolute' && position != 'relative')
                            $(this).css('position', 'relative');
                    });
                }
            });
        } : function() { return this; },
        unfixPNG: IE ? function() {
            return this.each(function () {
                $(this).css({'filter': '', backgroundImage: ''});
            });
        } : function() { return this; },
        hideWhenEmpty: function() {
            return this.each(function() {
                $(this)[ $(this).html() ? "show" : "hide" ]();
            });
        },
        url: function() {
            return this.attr('href') || this.attr('src');
        }
    });
    
    function createHelper(settings) {
        // there can be only one tooltip helper
        if( helper.parent )
            return;
        // create the helper, h3 for title, div for url
        helper.parent = $('<div id="' + settings.id + '"><h3></h3><div class="body"></div><div class="url"></div></div>')
            // add to document
            .appendTo(document.body)
            // hide it at first
            .hide();
            
        // apply bgiframe if available
        if ( $.fn.bgiframe )
            helper.parent.bgiframe();
        
        // save references to title and url elements
        helper.title = $('h3', helper.parent);
        helper.body = $('div.body', helper.parent);
        helper.url = $('div.url', helper.parent);
    }
    
    function settings(element) {
        return $.data(element, "tooltip");
    }
    
    // main event handler to start showing tooltips
    function handle(event) {
        // show helper, either with timeout or on instant
        if( settings(this).delay )
            tID = setTimeout(show, settings(this).delay);
        else
            show();
        
        // if selected, update the helper position when the mouse moves
        track = !!settings(this).track;
        $(document.body).bind('mousemove', update);
            
        // update at least once
        update(event);
    }
    
    // save elements title before the tooltip is displayed
    function save() {
        // if this is the current source, or it has no title (occurs with click event), stop
        if ( $.tooltip.blocked || this == current || (!this.tooltipText && !settings(this).bodyHandler) )
            return;
        // save current
        current = this;
        title = this.tooltipText;
        
        if ( settings(this).bodyHandler ) {
            helper.title.hide();
            var bodyContent = settings(this).bodyHandler.call(this);
            if (bodyContent.nodeType || bodyContent.jquery) {
                helper.body.empty().append(bodyContent)
            } else {
                helper.body.html( bodyContent );
            }
            helper.body.show();
        } else if ( settings(this).showBody ) {
            var parts = title.split(settings(this).showBody);
            helper.title.html(parts.shift()).show();
            helper.body.empty();
            for(var i = 0, part; (part = parts[i]); i++) {
                if(i > 0)
                    helper.body.append("<br/>");
                helper.body.append(part);
            }
            helper.body.hideWhenEmpty();
        } else {
            helper.title.html(title).show();
            helper.body.hide();
        }
        
        // if element has href or src, add and show it, otherwise hide it
        if( settings(this).showURL && $(this).url() )
            helper.url.html( $(this).url().replace('http://', '') ).show();
        else 
            helper.url.hide();
        
        // add an optional class for this tip
        helper.parent.addClass(settings(this).extraClass);
        // fix PNG background for IE
        if (settings(this).fixPNG )
            helper.parent.fixPNG();
            
        handle.apply(this, arguments);
    }
    
    // delete timeout and show helper
    function show() {
        tID = null;
        if ((!IE || !$.fn.bgiframe) && settings(current).fade) {
            if (helper.parent.is(":animated"))
                helper.parent.stop().show().fadeTo(settings(current).fade, current.tOpacity);
            else
                helper.parent.is(':visible') ? helper.parent.fadeTo(settings(current).fade, current.tOpacity) : helper.parent.fadeIn(settings(current).fade);
        } else {
            helper.parent.show();
        }
        update();
    }
    
    /**
     * callback for mousemove
     * updates the helper position
     * removes itself when no current element
     */
    function update(event)    {
        if($.tooltip.blocked)
            return;
        
        if (event && event.target.tagName == "OPTION") {
            return;
        }
        
        // stop updating when tracking is disabled and the tooltip is visible
        if ( !track && helper.parent.is(":visible")) {
            $(document.body).unbind('mousemove', update)
        }
        
        // if no current element is available, remove this listener
        if( current == null ) {
            $(document.body).unbind('mousemove', update);
            return;    
        }
        
        // remove position helper classes
        helper.parent.removeClass("viewport-right").removeClass("viewport-bottom");
        
        var left = helper.parent[0].offsetLeft;
        var top = helper.parent[0].offsetTop;
        if (event) {
            // position the helper 15 pixel to bottom right, starting from mouse position
            left = event.pageX + settings(current).left;
            top = event.pageY + settings(current).top;
            var right='auto';
            if (settings(current).positionLeft) {
                right = $(window).width() - left;
                left = 'auto';
            }
            helper.parent.css({
                left: left,
                right: right,
                top: top
            });
        }
        
        var v = viewport(),
            h = helper.parent[0];
        // check horizontal position
        if (v.x + v.cx < h.offsetLeft + h.offsetWidth) {
            left -= h.offsetWidth + 20 + settings(current).left;
            helper.parent.css({left: left + 'px'}).addClass("viewport-right");
        }
        // check vertical position
        if (v.y + v.cy < h.offsetTop + h.offsetHeight) {
            top -= h.offsetHeight + 20 + settings(current).top;
            helper.parent.css({top: top + 'px'}).addClass("viewport-bottom");
        }
    }
    
    function viewport() {
        return {
            x: $(window).scrollLeft(),
            y: $(window).scrollTop(),
            cx: $(window).width(),
            cy: $(window).height()
        };
    }
    
    // hide helper and restore added classes and the title
    function hide(event) {
        if($.tooltip.blocked)
            return;
        // clear timeout if possible
        if(tID)
            clearTimeout(tID);
        // no more current element
        current = null;
        
        var tsettings = settings(this);
        function complete() {
            helper.parent.removeClass( tsettings.extraClass ).hide().css("opacity", "");
        }
        if ((!IE || !$.fn.bgiframe) && tsettings.fade) {
            if (helper.parent.is(':animated'))
                helper.parent.stop().fadeTo(tsettings.fade, 0, complete);
            else
                helper.parent.stop().fadeOut(tsettings.fade, complete);
        } else
            complete();
        
        if( settings(this).fixPNG )
            helper.parent.unfixPNG();
    }
    
})(jQuery);/*!
 * jQuery UI Stars v3.0.1
 * http://plugins.jquery.com/project/Star_Rating_widget
 *
 * Copyright (c) 2010 Marek "Orkan" Zajac (orkans@gmail.com)
 * Dual licensed under the MIT and GPL licenses.
 * http://docs.jquery.com/License
 *
 * $Rev: 164 $
 * $Date:: 2010-05-01 #$
 * $Build: 35 (2010-05-01)
 *
 * Depends:
 *    jquery.ui.core.js
 *    jquery.ui.widget.js
 *
 */
(function($) {
$.widget('ui.stars', {
    options: {
        inputType: 'radio', // [radio|select]
        split: 0, // decrease number of stars by splitting each star into pieces [2|3|4|...]
        disabled: false, // set to [true] to make the stars initially disabled
        cancelTitle: 'Cancel Rating',
        cancelValue: 0, // default value of Cancel btn.
        cancelShow: true,
        disableValue: true, // set to [false] to not disable the hidden input when Cancel btn is clicked, so the value will present in POST data.
        oneVoteOnly: false,
        showTitles: false,
        captionEl: null, // jQuery object - target for text captions 
        callback: null, // function(ui, type, value, event)
        /*
         * CSS classes
         */
        starWidth: 16, // width of the star image
        cancelClass: 'ui-stars-cancel',
        starClass: 'ui-stars-star',
        starOnClass: 'ui-stars-star-on',
        starHoverClass: 'ui-stars-star-hover',
        starDisabledClass: 'ui-stars-star-disabled',
        cancelHoverClass: 'ui-stars-cancel-hover',
        cancelDisabledClass: 'ui-stars-cancel-disabled'
    },
    
    _create: function() {
        var self = this, o = this.options, starId = 0;
        this.element.data('former.stars', this.element.html());
        o.isSelect = o.inputType == 'select';
        this.$form = $(this.element).closest('form');
        this.$selec = o.isSelect ? $('select', this.element)  : null;
        this.$rboxs = o.isSelect ? $('option', this.$selec)   : $(':radio', this.element);
        /*
         * Map all inputs from $rboxs array to Stars elements
         */
        this.$stars = this.$rboxs.map(function(i)
        {
            var el = {
                value:      this.value,
                title:      (o.isSelect ? this.text : this.title) || this.value,
                isDefault:  (o.isSelect && this.defaultSelected) || this.defaultChecked
            };
            if(i==0) {
                o.split = typeof o.split != 'number' ? 0 : o.split;
                o.val2id = [];
                o.id2val = [];
                o.id2title = [];
                o.name = o.isSelect ? self.$selec.get(0).name : this.name;
                o.disabled = o.disabled || (o.isSelect ? $(self.$selec).attr('disabled') : $(this).attr('disabled'));
            }
            /*
             * Consider it as a Cancel button?
             */
            if(el.value == o.cancelValue) {
                o.cancelTitle = el.title;
                return null;
            }
            o.val2id[el.value] = starId;
            o.id2val[starId] = el.value;
            o.id2title[starId] = el.title;
            if(el.isDefault) {
                o.checked = starId;
                o.value = o.defaultValue = el.value;
                o.title = el.title;
            }
            var $s = $('<div/>').addClass(o.starClass);
            var $a = $('<a/>').attr('title', o.showTitles ? el.title : '').text(el.value);
            /*
             * Prepare division settings
             */
            if(o.split) {
                var oddeven = (starId % o.split);
                var stwidth = Math.floor(o.starWidth / o.split);
                $s.width(stwidth);
                $a.css('margin-left', '-' + (oddeven * stwidth) + 'px');
            }
            starId++;
            return $s.append($a).get(0);
        });
        /*
         * How many Stars?
         */
        o.items = starId;
        /*
         * Remove old content
         */
        o.isSelect ? this.$selec.remove() : this.$rboxs.remove();
        /*
         * Append Stars interface
         */
        this.$cancel = $('<div/>').addClass(o.cancelClass).append( $('<a/>').attr('title', o.showTitles ? o.cancelTitle : '').text(o.cancelValue) );
        o.cancelShow &= !o.disabled && !o.oneVoteOnly;
        o.cancelShow && this.element.append(this.$cancel);
        this.element.append(this.$stars);
        /*
         * Initial selection
         */
        if(o.checked === undefined) {
            o.checked = -1;
            o.value = o.defaultValue = o.cancelValue;
            o.title = '';
        }
        
        /*
         * The only FORM element, that has been linked to the stars control. The value field is updated on each Star click event
         */
        this.$value = $("<input type='hidden' name='"+o.name+"' value='"+o.value+"' />");
        this.element.append(this.$value);

        /*
         * Attach stars event handler
         */
        this.$stars.bind('click.stars', function(e) {
            if(!o.forceSelect && o.disabled) return false;
            var i = self.$stars.index(this);
            o.checked = i;
            o.value = o.id2val[i];
            o.title = o.id2title[i];
            self.$value.attr({disabled: o.disabled ? 'disabled' : '', value: o.value});
            fillTo(i, false);
            self._disableCancel();
            !o.forceSelect && self.callback(e, 'star');
        })
        .bind('mouseover.stars', function() {
            if(o.disabled) return false;
            var i = self.$stars.index(this);
            fillTo(i, true);
        })
        .bind('mouseout.stars', function() {
            if(o.disabled) return false;
            fillTo(self.options.checked, false);
        });

        /*
         * Attach cancel event handler
         */
        this.$cancel.bind('click.stars', function(e) {
            if(!o.forceSelect && (o.disabled || o.value == o.cancelValue)) return false;
            o.checked = -1;
            o.value = o.cancelValue;
            o.title = '';
            
            self.$value.val(o.value);
            o.disableValue && self.$value.attr({disabled: 'disabled'});
            fillNone();
            self._disableCancel();
            !o.forceSelect && self.callback(e, 'cancel');
        })
        .bind('mouseover.stars', function() {
            if(self._disableCancel()) return false;
            self.$cancel.addClass(o.cancelHoverClass);
            fillNone();
            self._showCap(o.cancelTitle);
        })
        .bind('mouseout.stars', function() {
            if(self._disableCancel()) return false;
            self.$cancel.removeClass(o.cancelHoverClass);
            self.$stars.triggerHandler('mouseout.stars');
        });

        /*
         * Attach onReset event handler to the parent FORM
         */
        this.$form.bind('reset.stars', function(){
            !o.disabled && self.select(o.defaultValue);
        });

        /*
         * Clean up to avoid memory leaks in certain versions of IE 6
         */
        $(window).unload(function(){
            self.$cancel.unbind('.stars');
            self.$stars.unbind('.stars');
            self.$form.unbind('.stars');
            self.$selec = self.$rboxs = self.$stars = self.$value = self.$cancel = self.$form = null;
        });

        /*
         * Star selection helpers
         */
        function fillTo(index, hover) {
            if(index != -1) {
                var addClass = hover ? o.starHoverClass : o.starOnClass;
                var remClass = hover ? o.starOnClass    : o.starHoverClass;
                self.$stars.eq(index).prevAll('.' + o.starClass).andSelf().removeClass(remClass).addClass(addClass);
                self.$stars.eq(index).nextAll('.' + o.starClass).removeClass(o.starHoverClass + ' ' + o.starOnClass);
                self._showCap(o.id2title[index]);
            }
            else fillNone();
        };
        function fillNone() {
            self.$stars.removeClass(o.starOnClass + ' ' + o.starHoverClass);
            self._showCap('');
        };

        /*
         * Finally, set up the Stars
         */
        this.select(o.value);
        o.disabled && this.disable();
    },
    /*
     * Private functions
     */
    _disableCancel: function() {
        var o = this.options, disabled = o.disabled || o.oneVoteOnly || (o.value == o.cancelValue);
        if(disabled)  this.$cancel.removeClass(o.cancelHoverClass).addClass(o.cancelDisabledClass);
        else          this.$cancel.removeClass(o.cancelDisabledClass);
        this.$cancel.css('opacity', disabled ? 0.5 : 1);
        return disabled;
    },
    _disableAll: function() {
        var o = this.options;
        this._disableCancel();
        if(o.disabled)  this.$stars.filter('div').addClass(o.starDisabledClass);
        else            this.$stars.filter('div').removeClass(o.starDisabledClass);
    },
    _showCap: function(s) {
        var o = this.options;
        if(o.captionEl) o.captionEl.text(s);
    },
    /*
     * Public functions
     */
    value: function() {
        return this.options.value;
    },
    select: function(val) {
        var o = this.options, e = (val == o.cancelValue) ? this.$cancel : this.$stars.eq(o.val2id[val]);
        o.forceSelect = true;
        e.triggerHandler('click.stars');
        o.forceSelect = false;
    },
    selectID: function(id) {
        var o = this.options, e = (id == -1) ? this.$cancel : this.$stars.eq(id);
        o.forceSelect = true;
        e.triggerHandler('click.stars');
        o.forceSelect = false;
    },
    enable: function() {
        this.options.disabled = false;
        this._disableAll();
    },
    disable: function() {
        this.options.disabled = true;
        this._disableAll();
    },
    destroy: function() {
        this.$form.unbind('.stars');
        this.$cancel.unbind('.stars').remove();
        this.$stars.unbind('.stars').remove();
        this.$value.remove();
        this.element.unbind('.stars').html(this.element.data('former.stars')).removeData('stars');
        return this;
    },
    callback: function(e, type) {
        var o = this.options;
        o.callback && o.callback(this, type, o.value, e);
        o.oneVoteOnly && !o.disabled && this.disable();
    }
});
$.extend($.ui.stars, {
    version: '3.0.1'
});
})(jQuery);// ColorBox v1.3.8 - a full featured, light-weight, customizable lightbox based on jQuery 1.3
// c) 2009 Jack Moore - www.colorpowered.com - jack@colorpowered.com
// Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
(function ($, window) {
   
   var
   // ColorBox Default Settings. 
   // See http://colorpowered.com/colorbox for details.
   defaults = {
      transition: "elastic",
      speed: 300,
      width: false,
      initialWidth: "600",
      innerWidth: false,
      maxWidth: false,
      height: false,
      initialHeight: "450",
      innerHeight: false,
      maxHeight: false,
      scalePhotos: true,
      scrolling: true,
      inline: false,
      html: false,
      iframe: false,
      photo: false,
      href: false,
      title: false,
      rel: false,
      opacity: 0.9,
      preloading: true,
      current: "image {current} of {total}",
      previous: "previous",
      next: "next",
      close: "close",
      open: false,
      loop: true,
      slideshow: false,
      slideshowAuto: true,
      slideshowSpeed: 2500,
      slideshowStart: "start slideshow",
      slideshowStop: "stop slideshow",
      onOpen: false,
      onLoad: false,
      onComplete: false,
      onCleanup: false,
      onClosed: false,
      overlayClose: true,     
      escKey: true,
      arrowKey: true
   },
   
   // Abstracting the HTML and event identifiers for easy rebranding
   colorbox = 'colorbox',
   prefix = 'cbox',
   
   // Events   
   event_open = prefix + '_open',
   event_load = prefix + '_load',
   event_complete = prefix + '_complete',
   event_cleanup = prefix + '_cleanup',
   event_closed = prefix + '_closed',
   
   // Special Handling for IE
   isIE = $.browser.msie && !$.support.opacity, // feature detection alone gave a false positive on at least one phone browser and on some development versions of Chrome.
   isIE6 = isIE && $.browser.version < 7,
   event_ie6 = prefix + '_IE6',
   // Cached jQuery Object Variables
   $overlay,
   $box,
   $wrap,
   $content,
   $topBorder,
   $leftBorder,
   $rightBorder,
   $bottomBorder,
   $related,
   $window,
   $loaded,
   $loadingBay,
   $loadingOverlay,
   $title,
   $current,
   $slideshow,
   $next,
   $prev,
   $close,
   // Variables for cached values or use across multiple functions
   interfaceHeight,
   interfaceWidth,
   loadedHeight,
   loadedWidth,
   element,
   bookmark,
   index,
   settings,
   open,
   active,
   
   publicMethod,
   boxElement = prefix + 'Element';
   
   // ****************
   // HELPER FUNCTIONS
   // ****************
   // jQuery object generator to reduce code size
   function $div(id, css) { 
      id = id ? ' id="' + prefix + id + '"' : '';
      css = css ? ' style="' + css + '"' : '';
      return $('<div' + id + css + '/>');
   }
   // Convert % values to pixels
   function setSize(size, dimension) {
      dimension = dimension === 'x' ? $window.width() : $window.height();
      return (typeof size === 'string') ? Math.round((size.match(/%/) ? (dimension / 100) * parseInt(size, 10) : parseInt(size, 10))) : size;
   }
   // Checks an href to see if it is a photo.
   // There is a force photo option (photo: true) for hrefs that cannot be matched by this regex.
   function isImage(url) {
      url = $.isFunction(url) ? url.call(element) : url;
      return settings.photo || url.match(/\.(gif|png|jpg|jpeg|bmp)(?:\?([^#]*))?(?:#(\.*))?$/i);
   }
   
   // Assigns functions results to their respective settings.  This allows functions to be used to set ColorBox options.
   function process() {
      for (var i in settings) {
         if ($.isFunction(settings[i]) && i.substring(0, 2) !== 'on') { // checks to make sure the function isn't one of the callbacks, they will be handled at the appropriate time.
             settings[i] = settings[i].call(element);
         }
      }
      settings.rel = settings.rel || element.rel || 'nofollow';
      settings.href = settings.href || $(element).attr('href');
      settings.title = settings.title || element.title;
   }
   function launch(elem) {
      
      element = elem;
      
      settings = $.extend({}, $(element).data(colorbox));
      
      process(); // Convert functions to their returned values.
      
      if (settings.rel !== 'nofollow') {
         $related = $('.' + boxElement).filter(function () {
            var relRelated = $(this).data(colorbox).rel || this.rel;
            return (relRelated === settings.rel);
         });
         index = $related.index(element);
         
         // Check direct calls to ColorBox.
         if (index === -1) {
            $related = $related.add(element);
            index = $related.length - 1;
         }
      } else {
         $related = $(element);
         index = 0;
      }
      
      if (!open) {
         open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys.
         
         bookmark = element;
         
         try {
            bookmark.blur(); // Remove the focus from the calling element.
         }catch (e) {}
         
         $.event.trigger(event_open);
         if (settings.onOpen) {
            settings.onOpen.call(element);
         }
         
         // +settings.opacity avoids a problem in IE when using non-zero-prefixed-string-values, like '.5'
         $overlay.css({"opacity": +settings.opacity, "cursor": settings.overlayClose ? "pointer" : "auto"}).show();
         
         // Opens inital empty ColorBox prior to content being loaded.
         settings.w = setSize(settings.initialWidth, 'x');
         settings.h = setSize(settings.initialHeight, 'y');
         publicMethod.position(0);
         
         if (isIE6) {
            $window.bind('resize.' + event_ie6 + ' scroll.' + event_ie6, function () {
               $overlay.css({width: $window.width(), height: $window.height(), top: $window.scrollTop(), left: $window.scrollLeft()});
            }).trigger('scroll.' + event_ie6);
         }
      }
      
      $current.add($prev).add($next).add($slideshow).add($title).hide();
      
      $close.html(settings.close).show();
      
      publicMethod.slideshow();
      
      publicMethod.load();
   }
   // ****************
   // PUBLIC FUNCTIONS
   // Usage format: $.fn.colorbox.close();
   // Usage from within an iframe: parent.$.fn.colorbox.close();
   // ****************
   
   publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) {
      var $this = this;
      
      if (!$this[0] && $this.selector) { // if a selector was given and it didn't match any elements, go ahead and exit.
         return $this;
      }
      
      options = options || {};
      
      if (callback) {
         options.onComplete = callback;
      }
      
      if (!$this[0] || $this.selector === undefined) { // detects $.colorbox() and $.fn.colorbox()
         $this = $('<a/>');
         options.open = true; // assume an immediate open
      }
      
      $this.each(function () {
         $(this).data(colorbox, $.extend({}, $(this).data(colorbox) || defaults, options)).addClass(boxElement);
      });
      
      if (options.open) {
         launch($this[0]);
      }
      
      return $this;
   };
   // Initialize ColorBox: store common calculations, preload the interface graphics, append the html.
   // This preps colorbox for a speedy open when clicked, and lightens the burdon on the browser by only
   // having to run once, instead of each time colorbox is opened.
   publicMethod.init = function () {
      // Create & Append jQuery Objects
      $window = $(window);
      $box = $div().attr({id: colorbox, 'class': isIE ? prefix + 'IE' : ''});
      $overlay = $div("Overlay", isIE6 ? 'position:absolute' : '').hide();
      
      $wrap = $div("Wrapper");
      $content = $div("Content").append(
         $loaded = $div("LoadedContent", 'width:0; height:0'),
         $loadingOverlay = $div("LoadingOverlay").add($div("LoadingGraphic")),
         $title = $div("Title"),
         $current = $div("Current"),
         $next = $div("Next"),
         $prev = $div("Previous"),
         $slideshow = $div("Slideshow"),
         $close = $div("Close")
      );
      $wrap.append( // The 3x3 Grid that makes up ColorBox
         $div().append(
            $div("TopLeft"),
            $topBorder = $div("TopCenter"),
            $div("TopRight")
         ),
         $div().append(
            $leftBorder = $div("MiddleLeft"),
            $content,
            $rightBorder = $div("MiddleRight")
         ),
         $div().append(
            $div("BottomLeft"),
            $bottomBorder = $div("BottomCenter"),
            $div("BottomRight")
         )
      ).children().children().css({'float': 'left'});
      
      $loadingBay = $div(false, 'position:absolute; width:9999px; visibility:hidden; display:none');
      
      $('body').prepend($overlay, $box.append($wrap, $loadingBay));
      
      $content.children()
      .hover(function () {
         $(this).addClass('hover');
      }, function () {
         $(this).removeClass('hover');
      }).addClass('hover');
      
      // Cache values needed for size calculations
      interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();//Subtraction needed for IE6
      interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width();
      loadedHeight = $loaded.outerHeight(true);
      loadedWidth = $loaded.outerWidth(true);
      
      // Setting padding to remove the need to do size conversions during the animation step.
      $box.css({"padding-bottom": interfaceHeight, "padding-right": interfaceWidth}).hide();
      
      // Setup button events.
      $next.click(publicMethod.next);
      $prev.click(publicMethod.prev);
      $close.click(publicMethod.close);
      
      // Adding the 'hover' class allowed the browser to load the hover-state
      // background graphics.  The class can now can be removed.
      $content.children().removeClass('hover');
      
      $('.' + boxElement).live('click', function (e) {
         // checks to see if it was a non-left mouse-click and for clicks modified with ctrl, shift, or alt.
         if ((e.button !== 0 && typeof e.button !== 'undefined') || e.ctrlKey || e.shiftKey || e.altKey) {
            return true;
         } else {
            launch(this);        
            return false;
         }
      });
      
      $overlay.click(function () {
         if (settings.overlayClose) {
            publicMethod.close();
         }
      });
      
      // Set Navigation Key Bindings
      $(document).bind("keydown", function (e) {
         if (open && settings.escKey && e.keyCode === 27) {
            e.preventDefault();
            publicMethod.close();
         }
         if (open && settings.arrowKey && !active && $related[1]) {
            if (e.keyCode === 37 && (index || settings.loop)) {
               e.preventDefault();
               $prev.click();
            } else if (e.keyCode === 39 && (index < $related.length - 1 || settings.loop)) {
               e.preventDefault();
               $next.click();
            }
         }
      });
   };
   
   publicMethod.remove = function () {
      $box.add($overlay).remove();
      $('.' + boxElement).die('click').removeData(colorbox).removeClass(boxElement);
   };
   publicMethod.position = function (speed, loadedCallback) {
      var
      animate_speed,
      // keeps the top and left positions within the browser's viewport.
      posTop = Math.max($window.height() - settings.h - loadedHeight - interfaceHeight, 0) / 2 + $window.scrollTop(),
      posLeft = Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2 + $window.scrollLeft();
      
      // setting the speed to 0 to reduce the delay between same-sized content.
      animate_speed = ($box.width() === settings.w + loadedWidth && $box.height() === settings.h + loadedHeight) ? 0 : speed;
      
      // this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly,
      // but it has to be shrank down around the size of div#colorbox when it's done.  If not,
      // it can invoke an obscure IE bug when using iframes.
      $wrap[0].style.width = $wrap[0].style.height = "9999px";
      
      function modalDimensions(that) {
         // loading overlay height has to be explicitly set for IE6.
         $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = that.style.width;
         $loadingOverlay[0].style.height = $loadingOverlay[1].style.height = $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = that.style.height;
      }
      
      $box.dequeue().animate({width: settings.w + loadedWidth, height: settings.h + loadedHeight, top: posTop, left: posLeft}, {
         duration: animate_speed,
         complete: function () {
            modalDimensions(this);
            
            active = false;
            
            // shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation.
            $wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px";
            $wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px";
            
            if (loadedCallback) {
               loadedCallback();
            }
         },
         step: function () {
            modalDimensions(this);
         }
      });
   };
   publicMethod.resize = function (options) {
      if (open) {
         options = options || {};
         
         if (options.width) {
            settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth;
         }
         if (options.innerWidth) {
            settings.w = setSize(options.innerWidth, 'x');
         }
         $loaded.css({width: settings.w});
         
         if (options.height) {
            settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight;
         }
         if (options.innerHeight) {
            settings.h = setSize(options.innerHeight, 'y');
         }
         if (!options.innerHeight && !options.height) {           
            var $child = $loaded.wrapInner("<div style='overflow:auto'></div>").children(); // temporary wrapper to get an accurate estimate of just how high the total content should be.
            settings.h = $child.height();
            $child.replaceWith($child.children()); // ditch the temporary wrapper div used in height calculation
         }
         $loaded.css({height: settings.h});
         
         publicMethod.position(settings.transition === "none" ? 0 : settings.speed);
      }
   };
   publicMethod.prep = function (object) {
      if (!open) {
         return;
      }
      
      var photo,
      speed = settings.transition === "none" ? 0 : settings.speed;
      
      $window.unbind('resize.' + prefix);
      $loaded.remove();
      $loaded = $div('LoadedContent').html(object);
      
      function getWidth() {
         settings.w = settings.w || $loaded.width();
         settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w;
         return settings.w;
      }
      function getHeight() {
         settings.h = settings.h || $loaded.height();
         settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h;
         return settings.h;
      }
      
      $loaded.hide()
      .appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations.
      .css({width: getWidth(), overflow: settings.scrolling ? 'auto' : 'hidden'})
      .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height.
      .prependTo($content);
      
      $loadingBay.hide();
      
      $('#' + prefix + 'Photo').css({cssFloat: 'none'});// floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width.
      
      // Hides SELECT elements in IE6 because they would otherwise sit on top of the overlay.
      if (isIE6) {
         $('select').not($box.find('select')).filter(function () {
            return this.style.visibility !== 'hidden';
         }).css({'visibility': 'hidden'}).one(event_cleanup, function () {
            this.style.visibility = 'inherit';
         });
      }
            
      function setPosition(s) {
         var prev, prevSrc, next, nextSrc, total = $related.length, loop = settings.loop;
         publicMethod.position(s, function () {
            function defilter() {
               if (isIE) {
                  //IE adds a filter when ColorBox fades in and out that can cause problems if the loaded content contains transparent pngs.
                  $box[0].style.removeAttribute("filter");
               }
            }
            
            if (!open) {
               return;
            }
            
            if (isIE) {
               //This fadeIn helps the bicubic resampling to kick-in.
               if (photo) {
                  $loaded.fadeIn(100);
               }
            }
            
            //Waited until the iframe is added to the DOM & it is visible before setting the src.
            //This increases compatability with pages using DOM dependent JavaScript.
            if (settings.iframe) {
               $("<iframe frameborder=0" + (settings.scrolling ? "" : " scrolling='no'") + (isIE ? " allowtransparency='true'" : '') + "/>")
               .appendTo($loaded)
               .attr({src: settings.href, name: new Date().getTime()});
            }
            
            $loaded.show();
            
            $title.show().html(settings.title);
            
            if (total > 1) { // handle grouping
               $current.html(settings.current.replace(/\{current\}/, index + 1).replace(/\{total\}/, total)).show();
               
               $next[(loop || index < total - 1) ? "show" : "hide"]().html(settings.next);
               $prev[(loop || index) ? "show" : "hide"]().html(settings.previous);
               
               prev = index ? $related[index - 1] : $related[total - 1];
               next = index < total - 1 ? $related[index + 1] : $related[0];
               
               if (settings.slideshow) {
                  $slideshow.show();
                  if (index === total - 1 && !loop && $box.is('.' + prefix + 'Slideshow_on')) {
                     $slideshow.click();
                  }
               }
               
               // Preloads images within a rel group
               if (settings.preloading) {
                  nextSrc = $(next).data(colorbox).href || next.href;
                  prevSrc = $(prev).data(colorbox).href || prev.href;
                  
                  if (isImage(nextSrc)) {
                     $('<img/>')[0].src = nextSrc;
                  }
                  
                  if (isImage(prevSrc)) {
                     $('<img/>')[0].src = prevSrc;
                  }
               }
            }
            
            $loadingOverlay.hide();
            
            if (settings.transition === 'fade') {
               $box.fadeTo(speed, 1, function () {
                  defilter();
               });
            } else {
               defilter();
            }
            
            $window.bind('resize.' + prefix, function () {
               publicMethod.position(0);
            });
            
            $.event.trigger(event_complete);
            if (settings.onComplete) {
               settings.onComplete.call(element);
            }
         });
      }
      
      if (settings.transition === 'fade') {
         $box.fadeTo(speed, 0, function () {
            setPosition(0);
         });
      } else {
         setPosition(speed);
      }
   };
   publicMethod.load = function () {
      var href, img, setResize, prep = publicMethod.prep;
      
      active = true;
      
      element = $related[index];
      
      settings = $.extend({}, $(element).data(colorbox));
      
      //convert functions to static values
      process();
      
      $.event.trigger(event_load);
      if (settings.onLoad) {
         settings.onLoad.call(element);
      }
      
      settings.h = settings.height ?
            setSize(settings.height, 'y') - loadedHeight - interfaceHeight :
            settings.innerHeight && setSize(settings.innerHeight, 'y');
      
      settings.w = settings.width ?
            setSize(settings.width, 'x') - loadedWidth - interfaceWidth :
            settings.innerWidth && setSize(settings.innerWidth, 'x');
      
      // Sets the minimum dimensions for use in image scaling
      settings.mw = settings.w;
      settings.mh = settings.h;
      
      // Re-evaluate the minimum width and height based on maxWidth and maxHeight values.
      // If the width or height exceed the maxWidth or maxHeight, use the maximum values instead.
      if (settings.maxWidth) {
         settings.mw = setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth;
         settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw;
      }
      if (settings.maxHeight) {
         settings.mh = setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight;
         settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh;
      }
      
      href = settings.href;
      
      $loadingOverlay.show();
      
      if (settings.inline) {
         // Inserts an empty placeholder where inline content is being pulled from.
         // An event is bound to put inline content back when ColorBox closes or loads new content.
         $div('InlineTemp').hide().insertBefore($(href)[0]).bind(event_load + ' ' + event_cleanup, function () {
            $(this).replaceWith($loaded.children());
         });
         prep($(href));
      } else if (settings.iframe) {
         // IFrame element won't be added to the DOM until it is ready to be displayed,
         // to avoid problems with DOM-ready JS that might be trying to run in that iframe.
         prep(" ");
      } else if (settings.html) {
         prep(settings.html);
      } else if (isImage(href)) {
         img = new Image();
         img.onload = function () {
            var percent;
            
            img.onload = null;
            img.id = prefix + 'Photo';
            $(img).css({margin: 'auto', border: 'none', display: 'block', cssFloat: 'left'});
            
            if (settings.scalePhotos) {
               setResize = function () {
                  img.height -= img.height * percent;
                  img.width -= img.width * percent;   
               };
               if (settings.mw && img.width > settings.mw) {
                  percent = (img.width - settings.mw) / img.width;
                  setResize();
               }
               if (settings.mh && img.height > settings.mh) {
                  percent = (img.height - settings.mh) / img.height;
                  setResize();
               }
            }
            
            if (settings.h) {
               img.style.marginTop = Math.max(settings.h - img.height, 0) / 2 + 'px';
            }
            
            setTimeout(function () { // Chrome will sometimes report a 0 by 0 size if there isn't pause in execution
               prep(img);
            }, 1);
            
            if ($related[1] && (index < $related.length - 1 || settings.loop)) {
               $(img).css({cursor: 'pointer'}).click(publicMethod.next);
            }
            
            if (isIE) {
               img.style.msInterpolationMode = 'bicubic';
            }
         };
         img.src = href;
      } else {
         $div().appendTo($loadingBay).load(href, function (data, status, xhr) {
            prep(status === 'error' ? 'Request unsuccessful: ' + xhr.statusText : this);
         });
      }
   };
   // Navigates to the next page/image in a set.
   publicMethod.next = function () {
      if (!active) {
         index = index < $related.length - 1 ? index + 1 : 0;
         publicMethod.load();
      }
   };
   
   publicMethod.prev = function () {
      if (!active) {
         index = index ? index - 1 : $related.length - 1;
         publicMethod.load();
      }
   };
   publicMethod.slideshow = function () {
      var stop, timeOut, className = prefix + 'Slideshow_';
      
      $slideshow.bind(event_closed, function () {
         $slideshow.unbind();
         clearTimeout(timeOut);
         $box.removeClass(className + "off " + className + "on");
      });
      
      function start() {
         $slideshow
         .text(settings.slideshowStop)
         .bind(event_complete, function () {
            timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed);
         })
         .bind(event_load, function () {
            clearTimeout(timeOut);  
         }).one("click", function () {
            stop();
         });
         $box.removeClass(className + "off").addClass(className + "on");
      }
      
      stop = function () {
         clearTimeout(timeOut);
         $slideshow
         .text(settings.slideshowStart)
         .unbind(event_complete + ' ' + event_load)
         .one("click", function () {
            start();
            timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed);
         });
         $box.removeClass(className + "on").addClass(className + "off");
      };
      
      if (settings.slideshow && $related[1]) {
         if (settings.slideshowAuto) {
            start();
         } else {
            stop();
         }
      }
   };
   // Note: to use this within an iframe use the following format: parent.$.fn.colorbox.close();
   publicMethod.close = function () {
      if (open) {
         open = false;
         
         $.event.trigger(event_cleanup);
         
         if (settings.onCleanup) {
            settings.onCleanup.call(element);
         }
         
         $window.unbind('.' + prefix + ' .' + event_ie6);
         
         $overlay.fadeTo('fast', 0);
         
         $box.stop().fadeTo('fast', 0, function () {
            $box.find('iframe').attr('src', 'about:blank'); // change the location of the iframe to avoid a problem in IE with flash objects not clearing.
            
            $loaded.remove();
            
            $box.add($overlay).css({'opacity': 1, cursor: 'auto'}).hide();
            
            try {
               bookmark.focus();
            } catch (e) {
               // do nothing
            }
            
            setTimeout(function () {
               $.event.trigger(event_closed);
               if (settings.onClosed) {
                  settings.onClosed.call(element);
               }
            }, 1);
         });
      }
   };
   // A method for fetching the current element ColorBox is referencing.
   // returns a jQuery object.
   publicMethod.element = function () {
      return $(element);
   };
   publicMethod.settings = defaults;
   // Initializes ColorBox when the DOM has loaded
   $(publicMethod.init);
}(jQuery, this));/* Copyright (c) 2009 Kelvin Luck (kelvin AT kelvinluck DOT com || http://www.kelvinluck.com)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 * 
 * See http://kelvinluck.com/assets/jquery/jScrollPane/
 * $Id: jScrollPane.js 93 2010-06-01 08:17:28Z kelvin.luck $
 */
/**
 * Replace the vertical scroll bars on any matched elements with a fancy
 * styleable (via CSS) version. With JS disabled the elements will
 * gracefully degrade to the browsers own implementation of overflow:auto.
 * If the mousewheel plugin has been included on the page then the scrollable areas will also
 * respond to the mouse wheel.
 *
 * @example jQuery(".scroll-pane").jScrollPane();
 *
 * @name jScrollPane
 * @type jQuery
 * @param Object    settings    hash with options, described below.
 *                                scrollbarWidth    -    The width of the generated scrollbar in pixels
 *                                scrollbarMargin    -    The amount of space to leave on the side of the scrollbar in pixels
 *                                wheelSpeed        -    The speed the pane will scroll in response to the mouse wheel in pixels
 *                                showArrows        -    Whether to display arrows for the user to scroll with
 *                                arrowSize        -    The height of the arrow buttons if showArrows=true
 *                                animateTo        -    Whether to animate when calling scrollTo and scrollBy
 *                                dragMinHeight    -    The minimum height to allow the drag bar to be
 *                                dragMaxHeight    -    The maximum height to allow the drag bar to be
 *                                animateInterval    -    The interval in milliseconds to update an animating scrollPane (default 100)
 *                                animateStep        -    The amount to divide the remaining scroll distance by when animating (default 3)
 *                                maintainPosition-    Whether you want the contents of the scroll pane to maintain it's position when you re-initialise it - so it doesn't scroll as you add more content (default true)
 *                                tabIndex        -    The tabindex for this jScrollPane to control when it is tabbed to when navigating via keyboard (default 0)
 *                                enableKeyboardNavigation - Whether to allow keyboard scrolling of this jScrollPane when it is focused (default true)
 *                                animateToInternalLinks - Whether the move to an internal link (e.g. when it's focused by tabbing or by a hash change in the URL) should be animated or instant (default false)
 *                                scrollbarOnLeft    -    Display the scrollbar on the left side?  (needs stylesheet changes, see examples.html)
 *                                reinitialiseOnImageLoad - Whether the jScrollPane should automatically re-initialise itself when any contained images are loaded (default false)
 *                                topCapHeight    -    The height of the "cap" area between the top of the jScrollPane and the top of the track/ buttons
 *                                bottomCapHeight    -    The height of the "cap" area between the bottom of the jScrollPane and the bottom of the track/ buttons
 *                                observeHash        -    Whether jScrollPane should attempt to automagically scroll to the correct place when an anchor inside the scrollpane is linked to (default true)
 * @return jQuery
 * @cat Plugins/jScrollPane
 * @author Kelvin Luck (kelvin AT kelvinluck DOT com || http://www.kelvinluck.com)
 */
(function($) {
$.jScrollPane = {
    active : []
};
$.fn.jScrollPane = function(settings)
{
    settings = $.extend({}, $.fn.jScrollPane.defaults, settings);
    var rf = function() { return false; };
    
    return this.each(
        function()
        {
            var $this = $(this);
            var paneEle = this;
            var currentScrollPosition = 0;
            var paneWidth;
            var paneHeight;
            var trackHeight;
            var trackOffset = settings.topCapHeight;
            var $container;
            
            if ($(this).parent().is('.jScrollPaneContainer')) {
                $container = $(this).parent();
                currentScrollPosition = settings.maintainPosition ? $this.position().top : 0;
                var $c = $(this).parent();
                paneWidth = $c.innerWidth();
                paneHeight = $c.outerHeight();
                $('>.jScrollPaneTrack, >.jScrollArrowUp, >.jScrollArrowDown, >.jScrollCap', $c).remove();
                $this.css({'top':0});
            } else {
                $this.data('originalStyleTag', $this.attr('style'));
                // Switch the element's overflow to hidden to ensure we get the size of the element without the scrollbars [http://plugins.jquery.com/node/1208]
                $this.css('overflow', 'hidden');
                this.originalPadding = $this.css('paddingTop') + ' ' + $this.css('paddingRight') + ' ' + $this.css('paddingBottom') + ' ' + $this.css('paddingLeft');
                this.originalSidePaddingTotal = (parseInt($this.css('paddingLeft')) || 0) + (parseInt($this.css('paddingRight')) || 0);
                paneWidth = $this.innerWidth();
                paneHeight = $this.innerHeight();
                $container = $('<div></div>')
                    .attr({'className':'jScrollPaneContainer'})
                    .css(
                        {
                            'height':paneHeight+'px', 
                            'width':paneWidth+'px'
                        }
                    );
                if (settings.enableKeyboardNavigation) {
                    $container.attr(
                        'tabindex', 
                        settings.tabIndex
                    );
                }
                $this.wrap($container);
                $container = $this.parent();
                // deal with text size changes (if the jquery.em plugin is included)
                // and re-initialise the scrollPane so the track maintains the
                // correct size
                $(document).bind(
                    'emchange', 
                    function(e, cur, prev)
                    {
                        $this.jScrollPane(settings);
                    }
                );
                
            }
            trackHeight = paneHeight;
            
            if (settings.reinitialiseOnImageLoad) {
                // code inspired by jquery.onImagesLoad: http://plugins.jquery.com/project/onImagesLoad
                // except we re-initialise the scroll pane when each image loads so that the scroll pane is always up to size...
                // TODO: Do I even need to store it in $.data? Is a local variable here the same since I don't pass the reinitialiseOnImageLoad when I re-initialise?
                var $imagesToLoad = $.data(paneEle, 'jScrollPaneImagesToLoad') || $('img', $this);
                var loadedImages = [];
                
                if ($imagesToLoad.length) {
                    $imagesToLoad.each(function(i, val)    {
                        $(this).bind('load readystatechange', function() {
                            if($.inArray(i, loadedImages) == -1){ //don't double count images
                                loadedImages.push(val); //keep a record of images we've seen
                                $imagesToLoad = $.grep($imagesToLoad, function(n, i) {
                                    return n != val;
                                });
                                $.data(paneEle, 'jScrollPaneImagesToLoad', $imagesToLoad);
                                var s2 = $.extend(settings, {reinitialiseOnImageLoad:false});
                                $this.jScrollPane(s2); // re-initialise
                            }
                        }).each(function(i, val) {
                            if(this.complete || this.complete===undefined) { 
                                //needed for potential cached images
                                this.src = this.src; 
                            } 
                        });
                    });
                };
            }
            var p = this.originalSidePaddingTotal;
            var realPaneWidth = paneWidth - settings.scrollbarWidth - settings.scrollbarMargin - p;
            var cssToApply = {
                'height':'auto',
                'width': realPaneWidth + 'px'
            }
            if(settings.scrollbarOnLeft) {
                cssToApply.paddingLeft = settings.scrollbarMargin + settings.scrollbarWidth + 'px';
            } else {
                cssToApply.paddingRight = settings.scrollbarMargin + 'px';
            }
            $this.css(cssToApply);
            var contentHeight = $this.outerHeight();
            var percentInView = paneHeight / contentHeight;
            
            var isScrollable = percentInView < .99;
            $container[isScrollable ? 'addClass' : 'removeClass']('jScrollPaneScrollable');
            if (isScrollable) {
                $container.append(
                    $('<div></div>').addClass('jScrollCap jScrollCapTop').css({height:settings.topCapHeight}),
                    $('<div></div>').attr({'className':'jScrollPaneTrack'}).css({'width':settings.scrollbarWidth+'px'}).append(
                        $('<div></div>').attr({'className':'jScrollPaneDrag'}).css({'width':settings.scrollbarWidth+'px'}).append(
                            $('<div></div>').attr({'className':'jScrollPaneDragTop'}).css({'width':settings.scrollbarWidth+'px'}),
                            $('<div></div>').attr({'className':'jScrollPaneDragBottom'}).css({'width':settings.scrollbarWidth+'px'})
                        )
                    ),
                    $('<div></div>').addClass('jScrollCap jScrollCapBottom').css({height:settings.bottomCapHeight})
                );
                
                var $track = $('>.jScrollPaneTrack', $container);
                var $drag = $('>.jScrollPaneTrack .jScrollPaneDrag', $container);
                
                
                var currentArrowDirection;
                var currentArrowTimerArr = [];// Array is used to store timers since they can stack up when dealing with keyboard events. This ensures all timers are cleaned up in the end, preventing an acceleration bug.
                var currentArrowInc;
                var whileArrowButtonDown = function() 
                {
                    if (currentArrowInc > 4 || currentArrowInc % 4 == 0) {
                        positionDrag(dragPosition + currentArrowDirection * mouseWheelMultiplier);
                    }
                    currentArrowInc++;
                };
                if (settings.enableKeyboardNavigation) {
                    $container.bind(
                        'keydown.jscrollpane',
                        function(e) 
                        {
                            switch (e.keyCode) {
                                case 38: //up
                                    currentArrowDirection = -1;
                                    currentArrowInc = 0;
                                    whileArrowButtonDown();
                                    currentArrowTimerArr[currentArrowTimerArr.length] = setInterval(whileArrowButtonDown, 100);
                                    return false;
                                case 40: //down
                                    currentArrowDirection = 1;
                                    currentArrowInc = 0;
                                    whileArrowButtonDown();
                                    currentArrowTimerArr[currentArrowTimerArr.length] = setInterval(whileArrowButtonDown, 100);
                                    return false;
                                case 33: // page up
                                case 34: // page down
                                    // TODO
                                    return false;
                                default:
                            }
                        }
                    ).bind(
                        'keyup.jscrollpane',
                        function(e) 
                        {
                            if (e.keyCode == 38 || e.keyCode == 40) {
                                for (var i = 0; i < currentArrowTimerArr.length; i++) {
                                    clearInterval(currentArrowTimerArr[i]);
                                }
                                return false;
                            }
                        }
                    );
                }
                if (settings.showArrows) {
                    
                    var currentArrowButton;
                    var currentArrowInterval;
                    var onArrowMouseUp = function(event)
                    {
                        $('html').unbind('mouseup', onArrowMouseUp);
                        currentArrowButton.removeClass('jScrollActiveArrowButton');
                        clearInterval(currentArrowInterval);
                    };
                    var onArrowMouseDown = function() {
                        $('html').bind('mouseup', onArrowMouseUp);
                        currentArrowButton.addClass('jScrollActiveArrowButton');
                        currentArrowInc = 0;
                        whileArrowButtonDown();
                        currentArrowInterval = setInterval(whileArrowButtonDown, 100);
                    };
                    $container
                        .append(
                            $('<a></a>')
                                .attr(
                                    {
                                        'href':'javascript:;', 
                                        'className':'jScrollArrowUp', 
                                        'tabindex':-1
                                    }
                                )
                                .css(
                                    {
                                        'width':settings.scrollbarWidth+'px',
                                        'top':settings.topCapHeight + 'px'
                                    }
                                )
                                .html('Scroll up')
                                .bind('mousedown', function()
                                {
                                    currentArrowButton = $(this);
                                    currentArrowDirection = -1;
                                    onArrowMouseDown();
                                    this.blur();
                                    return false;
                                })
                                .bind('click', rf),
                            $('<a></a>')
                                .attr(
                                    {
                                        'href':'javascript:;', 
                                        'className':'jScrollArrowDown', 
                                        'tabindex':-1
                                    }
                                )
                                .css(
                                    {
                                        'width':settings.scrollbarWidth+'px',
                                        'bottom':settings.bottomCapHeight + 'px'
                                    }
                                )
                                .html('Scroll down')
                                .bind('mousedown', function()
                                {
                                    currentArrowButton = $(this);
                                    currentArrowDirection = 1;
                                    onArrowMouseDown();
                                    this.blur();
                                    return false;
                                })
                                .bind('click', rf)
                        );
                    var $upArrow = $('>.jScrollArrowUp', $container);
                    var $downArrow = $('>.jScrollArrowDown', $container);
                }
                
                if (settings.arrowSize) {
                    trackHeight = paneHeight - settings.arrowSize - settings.arrowSize;
                    trackOffset += settings.arrowSize;
                } else if ($upArrow) {
                    var topArrowHeight = $upArrow.height();
                    settings.arrowSize = topArrowHeight;
                    trackHeight = paneHeight - topArrowHeight - $downArrow.height();
                    trackOffset += topArrowHeight;
                }
                trackHeight -= settings.topCapHeight + settings.bottomCapHeight;
                $track.css({'height': trackHeight+'px', top:trackOffset+'px'})
                
                var $pane = $(this).css({'position':'absolute', 'overflow':'visible'});
                
                var currentOffset;
                var maxY;
                var mouseWheelMultiplier;
                // store this in a seperate variable so we can keep track more accurately than just updating the css property..
                var dragPosition = 0;
                var dragMiddle = percentInView*paneHeight/2;
                
                // pos function borrowed from tooltip plugin and adapted...
                var getPos = function (event, c) {
                    var p = c == 'X' ? 'Left' : 'Top';
                    return event['page' + c] || (event['client' + c] + (document.documentElement['scroll' + p] || document.body['scroll' + p])) || 0;
                };
                
                var ignoreNativeDrag = function() {    return false; };
                
                var initDrag = function()
                {
                    ceaseAnimation();
                    currentOffset = $drag.offset(false);
                    currentOffset.top -= dragPosition;
                    maxY = trackHeight - $drag[0].offsetHeight;
                    mouseWheelMultiplier = 2 * settings.wheelSpeed * maxY / contentHeight;
                };
                
                var onStartDrag = function(event)
                {
                    initDrag();
                    dragMiddle = getPos(event, 'Y') - dragPosition - currentOffset.top;
                    $('html').bind('mouseup', onStopDrag).bind('mousemove', updateScroll).bind('mouseleave', onStopDrag)
                    if ($.browser.msie) {
                        $('html').bind('dragstart', ignoreNativeDrag).bind('selectstart', ignoreNativeDrag);
                    }
                    return false;
                };
                var onStopDrag = function()
                {
                    $('html').unbind('mouseup', onStopDrag).unbind('mousemove', updateScroll);
                    dragMiddle = percentInView*paneHeight/2;
                    if ($.browser.msie) {
                        $('html').unbind('dragstart', ignoreNativeDrag).unbind('selectstart', ignoreNativeDrag);
                    }
                };
                var positionDrag = function(destY)
                {
                    $container.scrollTop(0);
                    destY = destY < 0 ? 0 : (destY > maxY ? maxY : destY);
                    dragPosition = destY;
                    $drag.css({'top':destY+'px'});
                    var p = destY / maxY;
                    $this.data('jScrollPanePosition', (paneHeight-contentHeight)*-p);
                    $pane.css({'top':((paneHeight-contentHeight)*p) + 'px'});
                    $this.trigger('scroll');
                    if (settings.showArrows) {
                        $upArrow[destY == 0 ? 'addClass' : 'removeClass']('disabled');
                        $downArrow[destY == maxY ? 'addClass' : 'removeClass']('disabled');
                    }
                };
                var updateScroll = function(e)
                {
                    positionDrag(getPos(e, 'Y') - currentOffset.top - dragMiddle);
                };
                
                var dragH = Math.max(Math.min(percentInView*(paneHeight-settings.arrowSize*2), settings.dragMaxHeight), settings.dragMinHeight);
                
                $drag.css(
                    {'height':dragH+'px'}
                ).bind('mousedown', onStartDrag);
                
                var trackScrollInterval;
                var trackScrollInc;
                var trackScrollMousePos;
                var doTrackScroll = function()
                {
                    if (trackScrollInc > 8 || trackScrollInc%4==0) {
                        positionDrag((dragPosition - ((dragPosition - trackScrollMousePos) / 2)));
                    }
                    trackScrollInc ++;
                };
                var onStopTrackClick = function()
                {
                    clearInterval(trackScrollInterval);
                    $('html').unbind('mouseup', onStopTrackClick).unbind('mousemove', onTrackMouseMove);
                };
                var onTrackMouseMove = function(event)
                {
                    trackScrollMousePos = getPos(event, 'Y') - currentOffset.top - dragMiddle;
                };
                var onTrackClick = function(event)
                {
                    initDrag();
                    onTrackMouseMove(event);
                    trackScrollInc = 0;
                    $('html').bind('mouseup', onStopTrackClick).bind('mousemove', onTrackMouseMove);
                    trackScrollInterval = setInterval(doTrackScroll, 100);
                    doTrackScroll();
                    return false;
                };
                
                $track.bind('mousedown', onTrackClick);
                
                $container.bind(
                    'mousewheel',
                    function (event, delta) {
                        delta = delta || (event.wheelDelta ? event.wheelDelta / 120 : (event.detail) ?
-event.detail/3 : 0);
                        initDrag();
                        ceaseAnimation();
                        var d = dragPosition;
                        positionDrag(dragPosition - delta * mouseWheelMultiplier);
                        var dragOccured = d != dragPosition;
                        return !dragOccured;
                    }
                );
                var _animateToPosition;
                var _animateToInterval;
                function animateToPosition()
                {
                    var diff = (_animateToPosition - dragPosition) / settings.animateStep;
                    if (diff > 1 || diff < -1) {
                        positionDrag(dragPosition + diff);
                    } else {
                        positionDrag(_animateToPosition);
                        ceaseAnimation();
                    }
                }
                var ceaseAnimation = function()
                {
                    if (_animateToInterval) {
                        clearInterval(_animateToInterval);
                        delete _animateToPosition;
                    }
                };
                var scrollTo = function(pos, preventAni)
                {
                    if (typeof pos == "string") {
                        // Legal hash values aren't necessarily legal jQuery selectors so we need to catch any
                        // errors from the lookup...
                        try {
                            $e = $(pos, $this);
                        } catch (err) {
                            return;
                        }
                        if (!$e.length) return;
                        pos = $e.offset().top - $this.offset().top;
                    }
                    ceaseAnimation();
                    var maxScroll = contentHeight - paneHeight;
                    pos = pos > maxScroll ? maxScroll : pos;
                    $this.data('jScrollPaneMaxScroll', maxScroll);
                    var destDragPosition = pos/maxScroll * maxY;
                    if (preventAni || !settings.animateTo) {
                        positionDrag(destDragPosition);
                    } else {
                        $container.scrollTop(0);
                        _animateToPosition = destDragPosition;
                        _animateToInterval = setInterval(animateToPosition, settings.animateInterval);
                    }
                };
                $this[0].scrollTo = scrollTo;
                
                $this[0].scrollBy = function(delta)
                {
                    var currentPos = -parseInt($pane.css('top')) || 0;
                    scrollTo(currentPos + delta);
                };
                
                initDrag();
                
                scrollTo(-currentScrollPosition, true);
            
                // Deal with it when the user tabs to a link or form element within this scrollpane
                $('*', this).bind(
                    'focus',
                    function(event)
                    {
                        var $e = $(this);
                        
                        // loop through parents adding the offset top of any elements that are relatively positioned between
                        // the focused element and the jScrollPaneContainer so we can get the true distance from the top
                        // of the focused element to the top of the scrollpane...
                        var eleTop = 0;
                        
                        var preventInfiniteLoop = 100;
                        
                        while ($e[0] != $this[0]) {
                            eleTop += $e.position().top;
                            $e = $e.offsetParent();
                            if (!preventInfiniteLoop--) {
                                return;
                            }
                        }
                        
                        var viewportTop = -parseInt($pane.css('top')) || 0;
                        var maxVisibleEleTop = viewportTop + paneHeight;
                        var eleInView = eleTop > viewportTop && eleTop < maxVisibleEleTop;
                        if (!eleInView) {
                            var destPos = eleTop - settings.scrollbarMargin;
                            if (eleTop > viewportTop) { // element is below viewport - scroll so it is at bottom.
                                destPos += $(this).height() + 15 + settings.scrollbarMargin - paneHeight;
                            }
                            scrollTo(destPos);
                        }
                    }
                )
                
                
                if (settings.observeHash) {
                    if (location.hash && location.hash.length > 1) {
                        setTimeout(function(){
                            scrollTo(location.hash);
                        }, $.browser.safari ? 100 : 0);
                    }
                    
                    // use event delegation to listen for all clicks on links and hijack them if they are links to
                    // anchors within our content...
                    $(document).bind('click', function(e){
                        $target = $(e.target);
                        if ($target.is('a')) {
                            var h = $target.attr('href');
                            if (h && h.substr(0, 1) == '#' && h.length > 1) {
                                setTimeout(function(){
                                    scrollTo(h, !settings.animateToInternalLinks);
                                }, $.browser.safari ? 100 : 0);
                            }
                        }
                    });
                }
                
                // Deal with dragging and selecting text to make the scrollpane scroll...
                function onSelectScrollMouseDown(e)
                {
                   $(document).bind('mousemove.jScrollPaneDragging', onTextSelectionScrollMouseMove);
                   $(document).bind('mouseup.jScrollPaneDragging',   onSelectScrollMouseUp);
                  
                }
                
                var textDragDistanceAway;
                var textSelectionInterval;
                
                function onTextSelectionInterval()
                {
                    direction = textDragDistanceAway < 0 ? -1 : 1;
                    $this[0].scrollBy(textDragDistanceAway / 2);
                }
                function clearTextSelectionInterval()
                {
                    if (textSelectionInterval) {
                        clearInterval(textSelectionInterval);
                        textSelectionInterval = undefined;
                    }
                }
                
                function onTextSelectionScrollMouseMove(e)
                {
                    var offset = $this.parent().offset().top;
                    var maxOffset = offset + paneHeight;
                    var mouseOffset = getPos(e, 'Y');
                    textDragDistanceAway = mouseOffset < offset ? mouseOffset - offset : (mouseOffset > maxOffset ? mouseOffset - maxOffset : 0);
                    if (textDragDistanceAway == 0) {
                        clearTextSelectionInterval();
                    } else {
                        if (!textSelectionInterval) {
                            textSelectionInterval  = setInterval(onTextSelectionInterval, 100);
                        }
                    }
                }
                function onSelectScrollMouseUp(e)
                {
                   $(document)
                      .unbind('mousemove.jScrollPaneDragging')
                      .unbind('mouseup.jScrollPaneDragging');
                   clearTextSelectionInterval();
                }
                $container.bind('mousedown.jScrollPane', onSelectScrollMouseDown);
                
                $.jScrollPane.active.push($this[0]);
                
            } else {
                $this.css(
                    {
                        'height':paneHeight+'px',
                        'width':paneWidth-this.originalSidePaddingTotal+'px',
                        'padding':this.originalPadding
                    }
                );
                $this[0].scrollTo = $this[0].scrollBy = function() {};
                // clean up listeners
                $this.parent().unbind('mousewheel').unbind('mousedown.jScrollPane').unbind('keydown.jscrollpane').unbind('keyup.jscrollpane');
            }
            
        }
    )
};
$.fn.jScrollPaneRemove = function()
{
    $(this).each(function()
    {
        $this = $(this);
        var $c = $this.parent();
        if ($c.is('.jScrollPaneContainer')) {
            $this.css(
                {
                    'top':'',
                    'height':'',
                    'width':'',
                    'padding':'',
                    'overflow':'',
                    'position':''
                }
            );
            $this.attr('style', $this.data('originalStyleTag'));
            $c.after($this).remove();
        }
    });
}
$.fn.jScrollPane.defaults = {
    scrollbarWidth : 10,
    scrollbarMargin : 5,
    wheelSpeed : 18,
    showArrows : false,
    arrowSize : 0,
    animateTo : false,
    dragMinHeight : 1,
    dragMaxHeight : 99999,
    animateInterval : 100,
    animateStep: 3,
    maintainPosition: true,
    scrollbarOnLeft: false,
    reinitialiseOnImageLoad: false,
    tabIndex : 0,
    enableKeyboardNavigation: true,
    animateToInternalLinks: false,
    topCapHeight: 0,
    bottomCapHeight: 0,
    observeHash: true
};
// clean up the scrollTo expandos
$(window)
    .bind('unload', function() {
        var els = $.jScrollPane.active; 
        for (var i=0; i<els.length; i++) {
            els[i].scrollTo = els[i].scrollBy = null;
        }
    }
);
})(jQuery);/* ------------------------------------------------------------------------------------ */
/* tweet/jtwitter/gettwitter                                                                 */
/* ------------------------------------------------------------------------------------ */
(function ($) {
    $.fn.tweet = function (o) {
        var s = {
            username: [],              // [string]   required, unless you want to display our tweets. :) it can be an array, just do ["username1","username2","etc"]
            list: null,                              //[string]   optional name of list belonging to username
            avatar_size: null,                      // [integer]  height and width of avatar if displayed (48px max)
            count: 3,                               // [integer]  how many tweets to display?
            intro_text: null,                       // [string]   do you want text BEFORE your your tweets?
            outro_text: null,                       // [string]   do you want text AFTER your tweets?
            join_text: null,                       // [string]   optional text in between date and tweet, try setting to "auto"
            auto_join_text_default: "i said,",      // [string]   auto text for non verb: "i said" bullocks
            auto_join_text_ed: "i",                 // [string]   auto text for past tense: "i" surfed
            auto_join_text_ing: "i am",             // [string]   auto tense for present tense: "i was" surfing
            auto_join_text_reply: "i replied to",   // [string]   auto tense for replies: "i replied to" @someone "with"
            auto_join_text_url: "i was looking at", // [string]   auto tense for urls: "i was looking at" http:...
            loading_text: null,                     // [string]   optional loading text, displayed while tweets load
            query: null                             // [string]   optional search query
        };
        if (o) $.extend(s, o);
        $.fn.extend({
            linkUrl: function () {
                var returning = [];
                var regexp = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
                this.each(function () {
                    returning.push(this.replace(regexp, "<a target='_blank' href=\"$1\">$1</a>"));
                });
                return $(returning);
            },
            linkUser: function () {
                var returning = [];
                var regexp = /[\@]+([A-Za-z0-9-_]+)/gi;
                this.each(function () {
                    returning.push(this.replace(regexp, "<a target='_blank' href=\"http://twitter.com/$1\">@$1</a>"));
                });
                return $(returning);
            },
            linkHash: function () {
                var returning = [];
                var regexp = /(?:^| )[\#]+([A-Za-z0-9-_]+)/gi;
                this.each(function () {
                    returning.push(this.replace(regexp, ' <a target="_blank" href="http://search.twitter.com/search?q=&tag=$1&lang=all&from=' + s.username.join("%2BOR%2B") + '">#$1</a>'));
                });
                return $(returning);
            },
            capAwesome: function () {
                var returning = [];
                this.each(function () {
                    returning.push(this.replace(/\b(awesome)\b/gi, '<span class="awesome">$1</span>'));
                });
                return $(returning);
            },
            capEpic: function () {
                var returning = [];
                this.each(function () {
                    returning.push(this.replace(/\b(epic)\b/gi, '<span class="epic">$1</span>'));
                });
                return $(returning);
            },
            makeHeart: function () {
                var returning = [];
                this.each(function () {
                    returning.push(this.replace(/(&lt;)+[3]/gi, "<tt class='heart'>&#x2665;</tt>"));
                });
                return $(returning);
            }
        });
        function parse_date(date_str) {
            // The non-search twitter APIs return inconsistently-formatted dates, which Date.parse
            // cannot handle in IE. We therefore perform the following transformation:
            // "Wed Apr 29 08:53:31 +0000 2009" => "Wed, Apr 29 2009 08:53:31 +0000"
            return Date.parse(date_str.replace(/^([a-z]{3})( [a-z]{3} \d\d?)(.*)( \d{4})$/i, '$1,$2$4$3'));
        }
        function relative_time(time_value) {
            var parsed_date = parse_date(time_value);
            var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
            var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
            var r = '';
            if (delta < 60) {
                r = delta + ' seconds ago';
            } else if (delta < 120) {
                r = 'a minute ago';
            } else if (delta < (45 * 60)) {
                r = (parseInt(delta / 60, 10)).toString() + ' minutes ago';
            } else if (delta < (2 * 60 * 60)) {
                r = 'an hour ago';
            } else if (delta < (24 * 60 * 60)) {
                r = '' + (parseInt(delta / 3600, 10)).toString() + ' hours ago';
            } else if (delta < (48 * 60 * 60)) {
                r = 'a day ago';
            } else {
                r = (parseInt(delta / 86400, 10)).toString() + ' days ago';
            }
            return 'about ' + r;
        }
        function build_url() {
            var proto = ('https:' == document.location.protocol ? 'https:' : 'http:');
            if (s.list) {
                return proto + "//api.twitter.com/1/" + s.username[0] + "/lists/" + s.list + "/statuses.json?per_page=" + s.count + "&callback=?";
            } else if (s.query == null && s.username.length == 1) {
                return proto + '//api.twitter.com/1/statuses/user_timeline.json?screen_name=' + s.username[0] + '&count=' + s.count + '&include_rts=1&callback=?';
            } else {
                var query = (s.query || 'from:' + s.username.join(' OR from:'));
                return proto + '//search.twitter.com/search.json?&q=' + encodeURIComponent(query) + '&rpp=' + s.count + '&callback=?';
            }
        }
        return this.each(function (i, widget) {
            var list = $('<ul class="tweet_list">').appendTo(widget);
            var intro = '<p class="tweet_intro">' + s.intro_text + '</p>';
            var outro = '<p class="tweet_outro">' + s.outro_text + '</p>';
            var loading = $('<p class="loading">' + s.loading_text + '</p>');
            if (typeof (s.username) == "string") {
                s.username = [s.username];
            }
            if (s.loading_text) $(widget).append(loading);
            $.getJSON(build_url(), function (data) {
                if (s.loading_text) loading.remove();
                if (s.intro_text) list.before(intro);
                var tweets = (data.results || data);
                $.each(tweets, function (i, item) {
                    var from_user = item.from_user || item.user.screen_name;
                    // auto join text based on verb tense and content
                    if (s.join_text == "auto") {
                        if (item.text.match(/^(@([A-Za-z0-9-_]+)) .*/i)) {
                            var join_text = s.auto_join_text_reply;
                        } else if (item.text.match(/(^\w+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+) .*/i)) {
                            var join_text = s.auto_join_text_url;
                        } else if (item.text.match(/^((\w+ed)|just) .*/im)) {
                            var join_text = s.auto_join_text_ed;
                        } else if (item.text.match(/^(\w*ing) .*/i)) {
                            var join_text = s.auto_join_text_ing;
                        } else {
                            var join_text = s.auto_join_text_default;
                        }
                    } else if (s.join_text == "user") {
                        var join_text = '<a target="_blank" class="tweet_avatar" href="http://twitter.com/' + from_user + '">' + from_user + '</a>';
                    }
                    else {
                        var join_text = s.join_text;
                    };
                    var profile_image_url = item.profile_image_url || item.user.profile_image_url;
                    var join_template = '<span class="tweet_join"> ' + join_text + ' </span>';
                    var join = ((s.join_text) ? join_template : ' ');
                    var avatar_template = '<a target="_blank" class="tweet_avatar" href="http://twitter.com/' + from_user + '"><img src="' + profile_image_url + '" height="' + s.avatar_size + '" width="' + s.avatar_size + '" alt="' + from_user + '\'s avatar" title="' + from_user + '\'s avatar" border="0"/></a>';
                    var avatar = (s.avatar_size ? avatar_template : '');
                    var date = '<span class="tweet_time"><a target="_blank" href="http://twitter.com/' + from_user + '/statuses/' + item.id + '" title="view tweet on twitter">' + relative_time(item.created_at) + '</a></span>';
                    var text = '<span class="tweet_text">' + $([item.text]).linkUrl().linkUser().linkHash().makeHeart().capAwesome().capEpic()[0] + '</span>';
                    // until we create a template option, arrange the items below to alter a tweet's display.
                    //list.append('<li>' + avatar + join + date + text + '</li>');
                    //modified - AT
                    list.append('<li>' + avatar + '<span class="tweet_caption">' + join + date + '</span>' + text + '</li>');
                    list.children('li:first').addClass('tweet_first');
                    list.children('li:odd').addClass('tweet_even');
                    list.children('li:even').addClass('tweet_odd');
                });
                if (s.outro_text) list.after(outro);
                $(widget).trigger("loaded").trigger((tweets.length == 0 ? "empty" : "full"));
                // following line added by AT - 9 Nov 2010
                if (o.finished) o.finished();
            });
        });
    };
})(jQuery);
(function ($) {
    /*
    jquery.twitter.js v1.0
    Last updated: 26 October 2008
    Created by Damien du Toit
    http://coda.co.za/blog/2008/10/26/jquery-plugin-for-twitter
    Licensed under a Creative Commons Attribution-Non-Commercial 3.0 Unported License
    http://creativecommons.org/licenses/by-nc/3.0/
    */
    $.fn.getTwitter = function (options) {
        var o = $.extend({}, $.fn.getTwitter.defaults, options);
        // hide container element
        $(this).hide();
        // add heading to container element
        if (o.showHeading) {
            $(this).append('<h2>' + o.headingText + '</h2>');
        }
        // add twitter list to container element
        $(this).append('<ul id="twitter_update_list"><li></li></ul>');
        // hide twitter list
        $("ul#twitter_update_list").hide();
        // add preLoader to container element
        var pl = $('<p id="' + o.preloaderId + '">' + o.loaderText + '</p>');
        $(this).append(pl);
        // add Twitter profile link to container element
        if (o.showProfileLink) {
            $(this).append('<a id="profileLink" href="http://twitter.com/' + o.userName + '" target="_blank"><img src="/logo_twitter.gif"></a>');
        }
        // show container element
        $(this).show();
        $.getScript("http://twitter.com/javascripts/blogger.js");
        $.getScript("http://twitter.com/statuses/user_timeline/" + o.userName + ".json?callback=twitterCallback2&count=" + o.numTweets, function () {
            // remove preLoader from container element
            $(pl).remove();
            // show twitter list
            if (o.slideIn) {
                $("ul#twitter_update_list").slideDown(1000);
            }
            else {
                $("ul#twitter_update_list").show();
            }
            // give first list item a special class
            //$("ul#twitter_update_list li:first").addClass("firstTweet");
            // give last list item a special class
            $("ul#twitter_update_list li:last").addClass("lastTweet");
            $("ul#twitter_update_list li a").each(function () {
                var parentTag = $(this).parent().get(0).tagName;
                if (parentTag == "LI") {
                    $(this).addClass("twitLink");
                    $(this).attr("target", "_blank");
                };
            });
        });
    };
    // plugin defaults
    $.fn.getTwitter.defaults = {
        userName: null,
        numTweets: 5,
        preloaderId: "preloader",
        loaderText: "Loading tweets...",
        slideIn: false,
        showHeading: true,
        headingText: "Latest Tweets",
        showProfileLink: true
    };
})(jQuery);
/*
* jTwitter 1.0 - Twitter API abstraction plugin for jQuery
*
* Copyright (c) 2009 jQuery Howto
*
* Licensed under the GPL license:
*   http://www.gnu.org/licenses/gpl.html
*
* URL:
*   http://jquery-howto.blogspot.com
*
* Author URL:
*   http://me.boo.uz
*
*/
(function ($) {
    $.extend({
        jTwitter: function (username, fnk) {
            var url = "http://twitter.com/status/user_timeline/"
            + username + ".json?count=1&callback=?";
            var info = {};
            $.getJSON(url, function (data) {
                if (typeof fnk == 'function') fnk.call(this, data[0].user);
            });
        }
    });
})(jQuery);
 function showTwitter(twitterAccount) {
    
    // load tweets
     $.jTwitter(twitterAccount, 10, function (data) {
         // create list
         $('.twitter-widget .tweets').empty().append('<ul></ul>');
         // append name/image/followers
         $('.twitter-widget .followers').html(data[0].user.followers_count + ' followers');
         $('.twitter-widget .image IMG').attr('src', data[0].user.profile_image_url);
         $('.twitter-widget .text A').append(data[0].user.name).attr('href', 'http://twitter.com/' + twitterAccount);
         // add each tweet to list
         $.each(data, function (i, post) {
             var li = $('<li class="item"><div class="text"></div><div class="subtext"></div></li>');
             li.find('.text').append(linkify(post.text));
             li.find('.subtext').append(niceDate(post.created_at));
             $('.twitter-widget .tweets ul').append(li);
         });
         // apply custom scroller
         var isiPad = navigator.userAgent.match(/iPad/i) != null;
         if (!isiPad) {
             $('.twitter-widget .tweets').jScrollPane({ scrollbarWidth: 14, dragMaxHeight: 27 });
         }
         else {
            $('.twitter-widget .tweets').css('overflow', 'auto');
         }
     });
}
jQuery.fn.showTwitter = function (options) {
    var content = this;
    // default settings
    var defaults = {
        twitteraccount: '',
        twitterquery: ''
    }
    var o = $.extend(defaults, options);
    content.find('.tweets').empty().append('<ul></ul>');
    $.jTwitter(o.twitteraccount, 10, function (data) {
        // append name/image/followers
        content.find('.followers').html(data[0].user.followers_count + ' followers');
        content.find('.image IMG').attr('src', data[0].user.profile_image_url);
        content.find('.text A').append(data[0].user.name).attr('href', 'http://twitter.com/' + o.twitteraccount);
    });
    if (o.twitterquery == '')
        o.twitterquery = 'from:' + o.twitteraccount;
    content.find('.tweets').tweet({
        query: o.twitterquery,
        join_text: "user",
        avatar_size: 50,
        count: 50,
        auto_join_text_default: "we said",
        auto_join_text_ed: "we",
        auto_join_text_ing: "we were",
        auto_join_text_reply: "we replied",
        auto_join_text_url: "we were checking out",
        loading_text: "",
        finished: function () {
            content.find('.tweets li').each(function () {
                var caption = $(this).find('.tweet_caption');
                var captionCopy = caption.clone();
                caption.remove();
                $(this).find('.tweet_text').after(captionCopy);
            });
            // apply custom scroller
            content.find('.tweets').jScrollPane({ scrollbarWidth: 14, dragMaxHeight: 27 });
        }
    });
};/**
 * This jQuery plugin displays pagination links inside the selected elements.
 * 
 * This plugin needs at least jQuery 1.4.2
 *
 * @author Gabriel Birke (birke *at* d-scribe *dot* de)
 * @version 2.0rc
 * @param {int} maxentries Number of entries to paginate
 * @param {Object} opts Several options (see README for documentation)
 * @return {Object} jQuery Object
 */
 (function($){
    /**
     * @class Class for calculating pagination values
     */
    $.PaginationCalculator = function(maxentries, opts) {
        this.maxentries = maxentries;
        this.opts = opts;
    }
    
    $.extend($.PaginationCalculator.prototype, {
        /**
         * Calculate the maximum number of pages
         * @method
         * @returns {Number}
         */
        numPages:function() {
            return Math.ceil(this.maxentries/this.opts.items_per_page);
        },
        /**
         * Calculate start and end point of pagination links depending on 
         * current_page and num_display_entries.
         * @returns {Array}
         */
        getInterval:function(current_page)  {
            var ne_half = Math.ceil(this.opts.num_display_entries/2);
            var np = this.numPages();
            var upper_limit = np - this.opts.num_display_entries;
            var start = current_page > ne_half ? Math.max( Math.min(current_page - ne_half, upper_limit), 0 ) : 0;
            var end = current_page > ne_half?Math.min(current_page+ne_half, np):Math.min(this.opts.num_display_entries, np);
            return {start:start, end:end};
        }
    });
    
    // Initialize jQuery object container for pagination renderers
    $.PaginationRenderers = {}
    
    /**
     * @class Default renderer for rendering pagination links
     */
    $.PaginationRenderers.defaultRenderer = function(maxentries, opts) {
        this.maxentries = maxentries;
        this.opts = opts;
        this.pc = new $.PaginationCalculator(maxentries, opts);
    }
    $.extend($.PaginationRenderers.defaultRenderer.prototype, {
        /**
         * Helper function for generating a single link (or a span tag if it's the current page)
         * @param {Number} page_id The page id for the new item
         * @param {Number} current_page 
         * @param {Object} appendopts Options for the new item: text and classes
         * @returns {jQuery} jQuery object containing the link
         */
        createLink:function(page_id, current_page, appendopts){
            var lnk, np = this.pc.numPages();
            page_id = page_id<0?0:(page_id<np?page_id:np-1); // Normalize page id to sane value
            appendopts = $.extend({text:page_id+1, classes:""}, appendopts||{});
            if(page_id == current_page){
                lnk = $("<span class='current'>" + appendopts.text + "</span>");
            }
            else
            {
                lnk = $("<a>" + appendopts.text + "</a>")
                    .attr('href', this.opts.link_to.replace(/__id__/,page_id));
            }
            if(appendopts.classes){ lnk.addClass(appendopts.classes); }
            lnk.data('page_id', page_id);
            return lnk;
        },
        // Generate a range of numeric links 
        appendRange:function(container, current_page, start, end) {
            var i;
            for(i=start; i<end; i++) {
                this.createLink(i, current_page).appendTo(container);
            }
        },
        getLinks:function(current_page, eventHandler) {
            var begin, end,
                interval = this.pc.getInterval(current_page),
                np = this.pc.numPages(),
                fragment = $("<div class='pagination'></div>");
            
            // Generate starting points
            if (interval.start > 0 && this.opts.num_edge_entries > 0)
            {
                end = Math.min(this.opts.num_edge_entries, interval.start);
                this.appendRange(fragment, current_page, 0, end);
                if(this.opts.num_edge_entries < interval.start && this.opts.ellipse_text)
                {
                    jQuery("<span>"+this.opts.ellipse_text+"</span>").appendTo(fragment);
                }
            }
            // Generate interval links
            this.appendRange(fragment, current_page, interval.start, interval.end);
            // Generate ending points
            if (interval.end < np && this.opts.num_edge_entries > 0)
            {
                if(np-this.opts.num_edge_entries > interval.end && this.opts.ellipse_text)
                {
                    jQuery("<span>"+this.opts.ellipse_text+"</span>").appendTo(fragment);
                }
                begin = Math.max(np-this.opts.num_edge_entries, interval.end);
                this.appendRange(fragment, current_page, begin, np);
                
            }
            // Generate "Previous"-Link
            if (this.opts.prev_text && (current_page > 0 || this.opts.prev_show_always)) {
                fragment.append(this.createLink(current_page - 1, current_page, { text: this.opts.prev_text, classes: "prev" }));
            }
            // Generate "Next"-Link
            if(this.opts.next_text && (current_page < np-1 || this.opts.next_show_always)){
                fragment.append(this.createLink(current_page+1, current_page, {text:this.opts.next_text, classes:"next"}));
            }
            $('a', fragment).click(eventHandler);
            return fragment;
        }
    });
    
    // Extend jQuery
    $.fn.pagination = function(maxentries, opts){
        
    // Initialize options with default values
    opts = jQuery.extend({
        items_per_page:10,
        num_display_entries:10,
        current_page:0,
        num_edge_entries:0,
        link_to:"#",
        prev_text:"Prev",
        next_text:"Next",
        ellipse_text:"...",
        prev_show_always:true,
        next_show_always:true,
        renderer:"defaultRenderer",
        callback:function(){return false;}
    },opts||{});
    
    var containers = this,
        renderer, links, current_page;
    
        
        /**
         * This is the event handling function for the pagination links. 
         * @param {int} page_id The new page number
         */
        function pageSelected(evt){
            var links, current_page = $(evt.target).data('page_id');
            containers.data('current_page', current_page);
            links = renderer.getLinks(current_page, pageSelected);
            containers.empty();
            links.appendTo(containers);
            var continuePropagation = opts.callback(current_page, containers);
            if (!continuePropagation) {
                if (evt.stopPropagation) {
                    evt.stopPropagation();
                }
                else {
                    evt.cancelBubble = true;
                }
            }
            return continuePropagation;
        }
        
        current_page = opts.current_page;
        containers.data('current_page', current_page);
        // Create a sane value for maxentries and items_per_page
        maxentries = (!maxentries || maxentries < 0)?1:maxentries;
        opts.items_per_page = (!opts.items_per_page || opts.items_per_page < 0)?1:opts.items_per_page;
        
        if(!$.PaginationRenderers[opts.renderer])
        {
            throw new ReferenceError("Pagination renderer '" + opts.renderer + "' was not found in jQuery.PaginationRenderers object.");
        }
        renderer = new $.PaginationRenderers[opts.renderer](maxentries, opts);
        
        containers.each(function() {
        // Attach control functions to the DOM element 
        this.selectPage = function(page_id){ pageSelected(page_id);}
        this.prevPage = function(){
            var current_page = containers.data('current_page');
            if (current_page > 0) {
                pageSelected(current_page - 1);
                return true;
            }
            else {
                return false;
            }
        }
        this.nextPage = function(){
            var current_page = containers.data('current_page');
            if(current_page < numPages()-1) {
                pageSelected(current_page+1);
                return true;
            }
            else {
                return false;
            }
        }
        });
        // When all initialisation is done, draw the links
        links = renderer.getLinks(current_page, pageSelected);
        containers.empty();
        links.appendTo(containers);
        // call callback function
        opts.callback(current_page, containers);
    
}
})(jQuery);
 
/* --------------------------------------------------------------------------------------- */
/* CUSTOM FUNCTION FOR CREATING THE PAGER (AT)
/* --------------------------------------------------------------------------------------- */
        function createPager(items, container, items_per_page) {
            
            if (items.length > items_per_page) {
                
                // Create pagination element
                var pager = $('<div class="pager"><div class="links"></div></div>');
                
                container.append(pager);
                
                pager.find('.links').pagination(items.length, {
                    items_per_page: items_per_page,
                    callback: function (page_id, jq) {
                        var top = (page_id * items_per_page) + items_per_page;
                        if (items.length < top) {
                            top = items.length;
                        }
                        pager.find('P').remove();
                        pager.prepend("<p>Showing " + ((page_id * items_per_page) + 1) + "-" + top + " of " + items.length + "</p>");
                        var count = 0;
                        items.each(function () {
                            count++;
                            if ((count < (page_id * items_per_page) + 1) || (count > (page_id * items_per_page) + items_per_page)) { $(this).hide(); }
                            else { $(this).show(); }
                        });
                        pager.find('.links').find('a, span').each(function () {
                            if ($(this).text() == 'Prev') $(this).html('&lt;&nbsp;Prev');
                            if ($(this).text() == 'Next') $(this).html('Next&nbsp;&gt;');
                        });
                        pager.find('.links').find('a').attr('href', 'javascript:;');
                    }
                });
                var count = 0;
                items.each(function () {
                    count++;
                    if ((count < 1) || (count > items_per_page)) { $(this).hide(); } 
                    else { $(this).show(); }
                });
                pager.find('.links').prepend('<span class="label">Go to page:</span> ');
            }
        }/**
 * jCarouselLite - jQuery plugin to navigate images/any content in a carousel style widget.
 * @requires jQuery v1.2 or above
 *
 * http://gmarwaha.com/jquery/jcarousellite/
 *
 * Copyright (c) 2007 Ganeshji Marwaha (gmarwaha.com)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 * Version: 1.0.1
 * Note: Requires jquery 1.2 or above from version 1.0.1
 */

(function($){$.fn.jCarouselLite=function(o){o=$.extend({btnPrev:null,btnNext:null,btnGo:null,mouseWheel:false,auto:null,speed:200,easing:null,vertical:false,circular:true,visible:3,start:0,scroll:1,beforeStart:null,afterEnd:null},o||{});return this.each(function(){var b=false,animCss=o.vertical?"top":"left",sizeCss=o.vertical?"height":"width";var c=$(this),ul=$("ul",c),tLi=$("li",ul),tl=tLi.size(),v=o.visible;if(o.circular){ul.prepend(tLi.slice(tl-v-1+1).clone()).append(tLi.slice(0,v).clone());o.start+=v}var f=$("li",ul),itemLength=f.size(),curr=o.start;c.css("visibility","visible");f.css({overflow:"hidden",float:o.vertical?"none":"left"});ul.css({margin:"0",padding:"0",position:"relative","list-style-type":"none","z-index":"1"});c.css({overflow:"hidden",position:"relative","z-index":"2",left:"0px"});var g=o.vertical?height(f):width(f);var h=g*itemLength;var j=g*v;f.css({width:f.width(),height:f.height()});ul.css(sizeCss,h+"px").css(animCss,-(curr*g));c.css(sizeCss,j+"px");if(o.btnPrev)$(o.btnPrev).click(function(){return go(curr-o.scroll)});if(o.btnNext)$(o.btnNext).click(function(){return go(curr+o.scroll)});if(o.btnGo)$.each(o.btnGo,function(i,a){$(a).click(function(){return go(o.circular?o.visible+i:i)})});if(o.mouseWheel&&c.mousewheel)c.mousewheel(function(e,d){return d>0?go(curr-o.scroll):go(curr+o.scroll)});if(o.auto)setInterval(function(){go(curr+o.scroll)},o.auto+o.speed);function vis(){return f.slice(curr).slice(0,v)};function go(a){if(!b){if(o.beforeStart)o.beforeStart.call(this,vis());if(o.circular){if(a<=o.start-v-1){ul.css(animCss,-((itemLength-(v*2))*g)+"px");curr=a==o.start-v-1?itemLength-(v*2)-1:itemLength-(v*2)-o.scroll}else if(a>=itemLength-v+1){ul.css(animCss,-((v)*g)+"px");curr=a==itemLength-v+1?v+1:v+o.scroll}else curr=a}else{if(a<0||a>itemLength-v)return;else curr=a}b=true;ul.animate(animCss=="left"?{left:-(curr*g)}:{top:-(curr*g)},o.speed,o.easing,function(){if(o.afterEnd)o.afterEnd.call(this,vis());b=false});if(!o.circular){$(o.btnPrev+","+o.btnNext).removeClass("disabled");$((curr-o.scroll<0&&o.btnPrev)||(curr+o.scroll>itemLength-v&&o.btnNext)||[]).addClass("disabled")}}return false}})};function css(a,b){return parseInt($.css(a[0],b))||0};function width(a){return a[0].offsetWidth+css(a,'marginLeft')+css(a,'marginRight')};function height(a){return a[0].offsetHeight+css(a,'marginTop')+css(a,'marginBottom')}})(jQuery);{ // a dummy block, so I can collapse all the meta stuff in the editor
/****************************************************************************
 * jQuery 1.3.x plugin to shorten styled text to fit in a block, appending
 * an ellipsis ("...", &hellip;, Unicode: 2026) or other text.
 * (Only supports ltr text for now.)
 *
 * This is achieved by placing the text of the 'selected' element (eg. span or
 * div) inside a table and measuring its width. If it's too big to big to fit in
 * the element's parent block it's shortened and measured again until it (and
 * appended ellipsis or text) fits inside the block. A tooltip on the 'selected'
 * element displays the full original text.
 *
 * If the browser supports truncating text using the 'text-overflow:ellipsis'
 * CSS property then that will be used (if the text to append is the default
 * ellipsis).
 *
 * If the text is truncated by the plugin any markup in the text will be
 * stripped (eg: "<a" starts stripping, "< a" does not). This behaviour is
 * dictated by the jQuery .text(val) method.
 * The appended text may contain HTML however (a link or span for example).
 *
 * Usage Example ('selecting' a div with an id of "element"):
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript" src="jquery.textTruncate.js"></script>
    <script type="text/javascript">
        $(function() {
            $("#element").textTruncate();
        });
    </script>
 * By default the plugin will use the parent block's width as maximum width and
 * an ellipsis as appended text when truncating.
 *
 * There are three ways of configuring the plugin:
 *
 * 1) Passing a configuration hash as the plugin's argument, eg:
    .textTruncate({
        width: 300,
        tail: ' <a href="#">more</a>',
        tooltip: false
    });
 * 2) Using two optional arguments (deprecated!):
 * width = the desired pixel width, integer
 * tail = text/html to append when truncating
 *
 * 3) By changing the plugin defaults, eg:
    $.fn.textTruncate.defaults.tail = ' <a href="#">more</a>';
 * Note: there is no default width (unless you create one).
 *
 * You may want to set the element's css to {visibility:hidden;} so it won't
 * initially flash at full width.
 *
 *
 * Created by M. David Green (www.mdavidgreen.com) in 2009. Free to use for
 * personal or commercial purposes under MIT (X11) license with no warranty
 *
 * Heavily modified/simplified/improved by Marc Diethelm (http://web5.me/).
 *
****************************************************************************/
}
(function ($) {
    $.fn.textTruncate = function() {
        var userOptions = {};
        var args = arguments; // for better minification
        var func = args.callee // dito; and much shorter than $.fn.textTruncate
        if ( args.length ) {
            if ( args[0].constructor == Object ) {
                userOptions = args[0];
            } else if ( args[0] == "options" ) {
                return $(this).eq(0).data("options-truncate");
            } else {
                userOptions = {
                    width: parseInt(args[0]),
                    tail: args[1]
                }
            }
        }
        this.css("visibility","hidden"); // Hide the element(s) while manipulating them
        // apply options vs. defaults
        var options = $.extend({}, func.defaults, userOptions);
        /**
         * HERE WE GO!
         **/
        return this.each(function () {
            var $this = $(this);
            $this.data("options-truncate", options);
            /**
             * If browser implements text-overflow:ellipsis in CSS and tail is "...", use it!
             **/
            if ( options.tail == "..." && func._native ) {
                this.style[func._native] = "ellipsis";
                /*var css_obj = {}
                css_obj[func._native] = "ellipsis";
                $this.css(css_obj);*/
                $this.css("visibility","visible");
                return true;
            }
            var width = options.width || $this.parent().width();
            var text = $this.text();
            var textlength = text.length;
            var css = "padding:0; margin:0; border:none; font:inherit;";
            var $table = $('<table style="'+ css +'width:auto;zoom:1;position:absolute;"><tr style="'+ css +'"><td style="'+ css +'white-space:nowrap;">' + options.tail + '</td></tr></table>');
            var $td = $("td", $table);
            $this.html( $table );
            var tailwidth = $td.width();
            var targetWidth = width - tailwidth;
            $td.text( text );
            if ($td.width() > width) {
                if ( options.tooltip ) {
                    $this.attr("title", text);
                }
                while ($td.width() >= targetWidth ) {
                    textlength--;
                    $td.html($td.html().substring(0, textlength)); // .html(val) is faster than .text(val) and we already used .text(val) to strip/escape html
                }
                text = $.trim( $td.html() );
                $this.html( text + options.tail );
            } else {
                $this.html( text );
            }
            this.style.visibility = "visible";
            return true;
        });
        return true;
    };
    var css = document.documentElement.style;
    var _native = false;
    if ( "textOverflow" in css ) {
        _native = "textOverflow";
    } else if ( "OTextOverflow" in css ) {
        _native = "OTextOverflow";
    }
    $.fn.textTruncate._native = _native;
    $.fn.textTruncate.defaults = {
        tail: "&hellip;",
        tooltip: true
    };
})(jQuery);
jQuery.fn.limitCharacters = function (maxChars) {
    // set to true if you don't want to break whole words
    var wholeWords = false;
    this.each(function () {
        var val = $(this).text();
        $(this).attr('title', val);
        if (val.length <= maxChars) {
            return;
        }
        else {
            if (wholeWords) {
                var lastSpace = val.indexOf(' ', maxChars);
                if (lastSpace <= 0)
                    lastSpace = maxChars;
                val = val.substring(0, lastSpace) + '...';
            }
            else {
                val = val.substring(0, maxChars) + '...';
            }
        }
        $(this).text(val);
    });
};/*
* Date Format 1.2.3
* (c) 2007-2009 Steven Levithan <stevenlevithan.com>
* MIT license
*
* Includes enhancements by Scott Trenda <scott.trenda.net>
* and Kris Kowal <cixar.com/~kris.kowal/>
*
* Accepts a date, a mask, or a date and a mask.
* Returns a formatted version of the given date.
* The date defaults to the current date/time.
* The mask defaults to dateFormat.masks.default.
*/
var dateFormat = function () {
    var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
        timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
        timezoneClip = /[^-+\dA-Z]/g,
        pad = function (val, len) {
            val = String(val);
            len = len || 2;
            while (val.length < len) val = "0" + val;
            return val;
        };
    // Regexes and supporting functions are cached through closure
    return function (date, mask, utc) {
        var dF = dateFormat;
        // You can't provide utc if you skip other args (use the "UTC:" mask prefix)
        if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {
            mask = date;
            date = undefined;
        }
        // Passing date through Date applies Date.parse, if necessary
        date = date ? new Date(date) : new Date;
        if (isNaN(date)) throw SyntaxError("invalid date");
        mask = String(dF.masks[mask] || mask || dF.masks["default"]);
        // Allow setting the utc argument via the mask
        if (mask.slice(0, 4) == "UTC:") {
            mask = mask.slice(4);
            utc = true;
        }
        var _ = utc ? "getUTC" : "get",
            d = date[_ + "Date"](),
            D = date[_ + "Day"](),
            m = date[_ + "Month"](),
            y = date[_ + "FullYear"](),
            H = date[_ + "Hours"](),
            M = date[_ + "Minutes"](),
            s = date[_ + "Seconds"](),
            L = date[_ + "Milliseconds"](),
            o = utc ? 0 : date.getTimezoneOffset(),
            flags = {
                d: d,
                dd: pad(d),
                ddd: dF.i18n.dayNames[D],
                dddd: dF.i18n.dayNames[D + 7],
                m: m + 1,
                mm: pad(m + 1),
                mmm: dF.i18n.monthNames[m],
                mmmm: dF.i18n.monthNames[m + 12],
                yy: String(y).slice(2),
                yyyy: y,
                h: H % 12 || 12,
                hh: pad(H % 12 || 12),
                H: H,
                HH: pad(H),
                M: M,
                MM: pad(M),
                s: s,
                ss: pad(s),
                l: pad(L, 3),
                L: pad(L > 99 ? Math.round(L / 10) : L),
                t: H < 12 ? "a" : "p",
                tt: H < 12 ? "am" : "pm",
                T: H < 12 ? "A" : "P",
                TT: H < 12 ? "AM" : "PM",
                Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
                o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
                S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
            };
        return mask.replace(token, function ($0) {
            return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
        });
    };
} ();
// Some common format strings
dateFormat.masks = {
    "default": "ddd mmm dd yyyy HH:MM:ss",
    shortDate: "m/d/yy",
    mediumDate: "mmm d, yyyy",
    longDate: "mmmm d, yyyy",
    fullDate: "dddd, mmmm d, yyyy",
    shortTime: "h:MM TT",
    mediumTime: "h:MM:ss TT",
    longTime: "h:MM:ss TT Z",
    isoDate: "yyyy-mm-dd",
    isoTime: "HH:MM:ss",
    isoDateTime: "yyyy-mm-dd'T'HH:MM:ss",
    isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
};
// Internationalization strings
dateFormat.i18n = {
    dayNames: [
        "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
        "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
    ],
    monthNames: [
        "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
        "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
    ]
};
// For convenience...
Date.prototype.format = function (mask, utc) {
    return dateFormat(this, mask, utc);
};/*
 ### jQuery XML to JSON Plugin v1.0 - 2008-07-01 ###
 * http://www.fyneworks.com/ - diego@fyneworks.com
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 ###
 Website: http://www.fyneworks.com/jquery/xml-to-json/
*/
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';5(10.M)(w($){$.N({11:w(j,k){5(!j)t{};w B(d,e){5(!d)t y;6 f=\'\',2=y,E=y;6 g=d.x,12=l(d.O||d.P);6 h=d.v||d.F||\'\';5(d.G){5(d.G.7>0){$.Q(d.G,w(n,a){6 b=a.x,u=l(a.O||a.P);6 c=a.v||a.F||\'\';5(b==8){t}z 5(b==3||b==4||!u){5(c.13(/^\\s+$/)){t};f+=c.H(/^\\s+/,\'\').H(/\\s+$/,\'\')}z{2=2||{};5(2[u]){5(!2[u].7)2[u]=p(2[u]);2[u][2[u].7]=B(a,R);2[u].7=2[u].7}z{2[u]=B(a)}}})}};5(d.I){5(d.I.7>0){E={};2=2||{};$.Q(d.I,w(a,b){6 c=l(b.14),C=b.15;E[c]=C;5(2[c]){5(!2[c].7)2[c]=p(2[c]);2[c][2[c].7]=C;2[c].7=2[c].7}z{2[c]=C}})}};5(2){2=$.N((f!=\'\'?A J(f):{}),2||{});f=(2.v)?(D(2.v)==\'16\'?2.v:[2.v||\'\']).17([f]):f;5(f)2.v=f;f=\'\'};6 i=2||f;5(k){5(f)i={};f=i.v||f||\'\';5(f)i.v=f;5(!e)i=p(i)};t i};6 l=w(s){t J(s||\'\').H(/-/g,"18")};6 m=w(s){t(D s=="19")||J((s&&D s=="K")?s:\'\').1a(/^((-)?([0-9]*)((\\.{0,1})([0-9]+))?$)/)};6 p=w(o){5(!o.7)o=[o];o.7=o.7;t o};5(D j==\'K\')j=$.S(j);5(!j.x)t;5(j.x==3||j.x==4)t j.F;6 q=(j.x==9)?j.1b:j;6 r=B(q,R);j=y;q=y;t r},S:w(a){6 b;T{6 c=($.U.V)?A 1c("1d.1e"):A 1f();c.1g=W}X(e){Y A L("Z 1h 1i 1j 1k 1l")};T{5($.U.V)b=(c.1m(a))?c:W;z b=c.1n(a,"v/1o")}X(e){Y A L("L 1p Z K")};t b}})})(M);',62,88,'||obj|||if|var|length||||||||||||||||||||||return|cnn|text|function|nodeType|null|else|new|parseXML|atv|typeof|att|nodeValue|childNodes|replace|attributes|String|string|Error|jQuery|extend|localName|nodeName|each|true|text2xml|try|browser|msie|false|catch|throw|XML|window|xml2json|nn|match|name|value|object|concat|_|number|test|documentElement|ActiveXObject|Microsoft|XMLDOM|DOMParser|async|Parser|could|not|be|instantiated|loadXML|parseFromString|xml|parsing'.split('|'),0,{}))/*
 ### jQuery Star Rating Plugin v3.13 - 2009-03-26 ###
 * Home: http://www.fyneworks.com/jquery/star-rating/
 * Code: http://code.google.com/p/jquery-star-rating-plugin/
 *
    * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 ###
*/
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';5(29.1j)(7($){5($.1L.1J)1I{1t.1H("1K",J,H)}1M(e){};$.n.3=7(i){5(4.Q==0)k 4;5(A I[0]==\'1h\'){5(4.Q>1){8 j=I;k 4.W(7(){$.n.3.y($(4),j)})};$.n.3[I[0]].y(4,$.1T(I).1U(1)||[]);k 4};8 i=$.12({},$.n.3.1s,i||{});$.n.3.K++;4.2a(\'.9-3-1f\').o(\'9-3-1f\').W(7(){8 a,l=$(4);8 b=(4.23||\'21-3\').1v(/\\[|\\]/g,\'Z\').1v(/^\\Z+|\\Z+$/g,\'\');8 c=$(4.1X||1t.1W);8 d=c.6(\'3\');5(!d||d.18!=$.n.3.K)d={z:0,18:$.n.3.K};8 e=d[b];5(e)a=e.6(\'3\');5(e&&a)a.z++;x{a=$.12({},i||{},($.1b?l.1b():($.1S?l.6():s))||{},{z:0,F:[],v:[]});a.w=d.z++;e=$(\'<1R V="9-3-1Q"/>\');l.1P(e);e.o(\'3-15-T-17\');5(l.S(\'R\'))a.m=H;e.1c(a.E=$(\'<P V="3-E"><a 14="\'+a.E+\'">\'+a.1d+\'</a></P>\').1g(7(){$(4).3(\'O\');$(4).o(\'9-3-N\')}).1i(7(){$(4).3(\'u\');$(4).G(\'9-3-N\')}).1l(7(){$(4).3(\'r\')}).6(\'3\',a))};8 f=$(\'<P V="9-3 q-\'+a.w+\'"><a 14="\'+(4.14||4.1p)+\'">\'+4.1p+\'</a></P>\');e.1c(f);5(4.11)f.S(\'11\',4.11);5(4.1r)f.o(4.1r);5(a.1F)a.t=2;5(A a.t==\'1u\'&&a.t>0){8 g=($.n.10?f.10():0)||a.1w;8 h=(a.z%a.t),Y=1y.1z(g/a.t);f.10(Y).1A(\'a\').1B({\'1C-1D\':\'-\'+(h*Y)+\'1E\'})};5(a.m)f.o(\'9-3-1o\');x f.o(\'9-3-1G\').1g(7(){$(4).3(\'1n\');$(4).3(\'D\')}).1i(7(){$(4).3(\'u\');$(4).3(\'C\')}).1l(7(){$(4).3(\'r\')});5(4.L)a.p=f;l.1q();l.1N(7(){$(4).3(\'r\')});f.6(\'3.l\',l.6(\'3.9\',f));a.F[a.F.Q]=f[0];a.v[a.v.Q]=l[0];a.q=d[b]=e;a.1O=c;l.6(\'3\',a);e.6(\'3\',a);f.6(\'3\',a);c.6(\'3\',d)});$(\'.3-15-T-17\').3(\'u\').G(\'3-15-T-17\');k 4};$.12($.n.3,{K:0,D:7(){8 a=4.6(\'3\');5(!a)k 4;5(!a.D)k 4;8 b=$(4).6(\'3.l\')||$(4.U==\'13\'?4:s);5(a.D)a.D.y(b[0],[b.M(),$(\'a\',b.6(\'3.9\'))[0]])},C:7(){8 a=4.6(\'3\');5(!a)k 4;5(!a.C)k 4;8 b=$(4).6(\'3.l\')||$(4.U==\'13\'?4:s);5(a.C)a.C.y(b[0],[b.M(),$(\'a\',b.6(\'3.9\'))[0]])},1n:7(){8 a=4.6(\'3\');5(!a)k 4;5(a.m)k;4.3(\'O\');4.1a().19().X(\'.q-\'+a.w).o(\'9-3-N\')},O:7(){8 a=4.6(\'3\');5(!a)k 4;5(a.m)k;a.q.1V().X(\'.q-\'+a.w).G(\'9-3-1k\').G(\'9-3-N\')},u:7(){8 a=4.6(\'3\');5(!a)k 4;4.3(\'O\');5(a.p){a.p.6(\'3.l\').S(\'L\',\'L\');a.p.1a().19().X(\'.q-\'+a.w).o(\'9-3-1k\')}x $(a.v).1m(\'L\');a.E[a.m||a.1Y?\'1q\':\'1Z\']();4.20()[a.m?\'o\':\'G\'](\'9-3-1o\')},r:7(a,b){8 c=4.6(\'3\');5(!c)k 4;5(c.m)k;c.p=s;5(A a!=\'B\'){5(A a==\'1u\')k $(c.F[a]).3(\'r\',B,b);5(A a==\'1h\')$.W(c.F,7(){5($(4).6(\'3.l\').M()==a)$(4).3(\'r\',B,b)})}x c.p=4[0].U==\'13\'?4.6(\'3.9\'):(4.22(\'.q-\'+c.w)?4:s);4.6(\'3\',c);4.3(\'u\');8 d=$(c.p?c.p.6(\'3.l\'):s);5((b||b==B)&&c.1e)c.1e.y(d[0],[d.M(),$(\'a\',c.p)[0]])},m:7(a,b){8 c=4.6(\'3\');5(!c)k 4;c.m=a||a==B?H:J;5(b)$(c.v).S("R","R");x $(c.v).1m("R");4.6(\'3\',c);4.3(\'u\')},1x:7(){4.3(\'m\',H,H)},24:7(){4.3(\'m\',J,J)}});$.n.3.1s={E:\'25 26\',1d:\'\',t:0,1w:16};$(7(){$(\'l[27=28].9\').3()})})(1j);',62,135,'|||rating|this|if|data|function|var|star|||||||||||return|input|readOnly|fn|addClass|current|rater|select|null|split|draw|inputs|serial|else|apply|count|typeof|undefined|blur|focus|cancel|stars|removeClass|true|arguments|false|calls|checked|val|hover|drain|div|length|disabled|attr|be|tagName|class|each|filter|spw|_|width|id|extend|INPUT|title|to||drawn|call|andSelf|prevAll|metadata|append|cancelValue|callback|applied|mouseover|string|mouseout|jQuery|on|click|removeAttr|fill|readonly|value|hide|className|options|document|number|replace|starWidth|disable|Math|floor|find|css|margin|left|px|half|live|execCommand|try|msie|BackgroundImageCache|browser|catch|change|context|before|control|span|meta|makeArray|slice|children|body|form|required|show|siblings|unnamed|is|name|enable|Cancel|Rating|type|radio|window|not'.split('|'),0,{}))/**
 * jQuery.ScrollTo - Easy element scrolling using jQuery.
 * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
 * Dual licensed under MIT and GPL.
 * Date: 5/25/2009
 * @author Ariel Flesler
 * @version 1.4.2
 *
 * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
 */
;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);// Tools for rating widget
// Copyright Network Ten 2010
// @author rsim
// JS / CSS required
// js-http://onehd.staging.ten.com.au/cutup/js/jquery-ui.custom.min.js
// js-http://onehd.staging.ten.com.au/cutup/js/jquery.ui.stars.js
// css-http://onehd.staging.ten.com.au/cutup/css/jquery.stars.css
// version 1.0 18/08/2010
var starRating = {
        contentRatings: {},
        ratingObjects: {},
        siteID: {},
        contentType: {},
        
        //Init
        setup: function (siteID, contentType, contentIDs){
            var contentIDList = new Array();
            if (contentIDs instanceof Array) {
                contentIDList = contentIDs
            } else {
                contentIDList.push(contentIDs)
            }
            
            this.siteID = siteID;
            
            this.contentType = contentType;
            
            this.getRating(siteID, contentType, contentIDList);
            
            return this;                        
        },
        
        //Get rating of the ID
        getRating: function (siteID, contentType, contentIDList){
            var ratingResults = new Array();
            
            var data = '<?xml version="1.0" encoding="utf-8" ?>';
            data += '<list>';
            data += '<siteId>'+siteID+'</siteId>';
            data += '<contentType id="'+contentType+'">';
            if (contentIDList.length > 0){
                for (i=0; i<contentIDList.length; i++){
                    data += '<media id="' + contentIDList[i] + ' "/>';
                }
            }
            data += '</contentType>';
            data += '</list>';
            
            $.ajax({
                type: "POST",
                url: "/ratings/getRateInfo.ashx",
                data: {data: data},
                dataType: "xml",
                async: false,
                success: function (xml) {
                    //alert(xml)
 
                    $(xml).find('content').each(function() {
                        ratingResults[$(this).attr('contentID')] = $(this).attr('rate')+","+$(this).attr('votes')+","+$(this).attr('allow');
                    });
                }
            });
            
            this.contentRatings = ratingResults;
        },
        
        //Draw the form
        drawForm: function (contentID, targetHtmlObject, customVars){
            
            var siteID = this.siteID;
            
            var contentType = this.contentType;
            
            var ratingData = this.contentRatings[contentID];
            
            var setUpVar = {
                    voteDisabled: true,
                    showResult: true,
                    div_prefix: "rating"
                };
                
            var r_setup;
            
            if (customVars === undefined){
                r_setup = setUpVar;
            } else {
                r_setup = $.extend(setUpVar, customVars);
            }
            
            var s_id = contentID + "_" + r_setup.div_prefix;
            
            if (ratingData == undefined){
                var avr = 0
                var count = 0;
                var vote_allow = false;
            } else {
                var avr = ratingData.split(',')[0];
                var count = ratingData.split(',')[1];
                var vote_allow = ratingData.split(',')[2];
            }
            
            countStr = count + " " + (count == 1 ? "vote" : "votes"); 
            
            //If particular content allow vote
            if ((vote_allow == "true") || (vote_allow == "True")){
                if(r_setup.voteDisabled){
                    var remarkStr;
                    switch(contentType){
                        case 1:
                          remarkStr = "Please watch the video to vote";
                          break;
                        case 2:
                          remarkStr = "Please view the photo to vote";
                          break;
                        case 3:
                          remarkStr = "Please read the recipe to vote";
                          break;
                        case 4:
                          remarkStr = "Please read the article to vote";
                          break;
                        default:
                          remarkStr = "Please select the content to vote";
                    }
                
                    var stars = $('<div class="st_rate_form">' +
                        '    <div class="stars dstf'+contentID+'" id="dummy_starRatingForm_' + s_id  + '">' +
                            getStarDrawn(s_id, avr, remarkStr) +
                        '    </div>' +
                        '</div>' +
                        '<div class="rateCount dstc'+contentID+'" id="dummy_countInfo_'+ s_id  + '">'+ countStr +'</div>'
                     );
                } else {
                    if(r_setup.showResult){
                    // Form set up to show result initially
                        var stars = $('<div class="st_rate_form">' +
                            '    <div class="stars stf'+contentID+'" id="starRatingForm_' + s_id  + '">' +
                            '        <input name="rating_' + contentID + '" type="radio" value="' + siteID + ',' + contentID + ',' + contentType + ',1" class="star" />' +
                            '        <input name="rating_' + contentID + '" type="radio" value="' + siteID + ',' + contentID + ',' + contentType + ',2" class="star" />' +
                            '        <input name="rating_' + contentID + '" type="radio" value="' + siteID + ',' + contentID + ',' + contentType + ',3" class="star" />' +
                            '        <input name="rating_' + contentID + '" type="radio" value="' + siteID + ',' + contentID + ',' + contentType + ',4" class="star" />' +
                            '        <input name="rating_' + contentID + '" type="radio" value="' + siteID + ',' + contentID + ',' + contentType + ',5" class="star" />' +
                            '    </div>' +
                            '    <div id="loader_'+s_id+'" class="loader">' +
                            '        <div style="padding-top: 5px;">loading...</div>' +
                            '    </div>' +
                            '    <div id="ro_starRating_' + s_id  + '" class="ro_form ro'+contentID+'">' +
                            '        <div class="stars" id="ro_starRatingForm_' + s_id  + '">' +
                                    getStarDrawn(s_id, avr) +
                            '        </div>' +
                            '    </div>' +
                            '</div>' +
                            '<div class="rateCount stc'+contentID+'" id="countInfo_'+ s_id  + '">'+ countStr +'</div>'
                        );
                    } else {
                    // Form set up to hide result initially
                        var stars = $('<div class="stars stf'+contentID+'" id="starRatingForm_' + s_id  + '">' +
                            '<input name="rating_' + contentID + '" type="radio" value="' + siteID + ',' + contentID + ',' + contentType + ',1" class="star" ' + '/>' +
                            '<input name="rating_' + contentID + '" type="radio" value="' + siteID + ',' + contentID + ',' + contentType + ',2" class="star" ' + '/>' +
                            '<input name="rating_' + contentID + '" type="radio" value="' + siteID + ',' + contentID + ',' + contentType + ',3" class="star" ' + '/>' +
                            '<input name="rating_' + contentID + '" type="radio" value="' + siteID + ',' + contentID + ',' + contentType + ',4" class="star" ' + '/>' +
                            '<input name="rating_' + contentID + '" type="radio" value="' + siteID + ',' + contentID + ',' + contentType + ',5" class="star" ' + '/>' +
                            '</div>' +
                            '<div id="loader_'+s_id+'" class="loader"><div style="padding-top: 5px;">please wait...</div></div>'
                        );
                    }
                }
            } else {
                //No voting allows
                var stars = $('<div class="st_rate_form">' +
                        '    <div class="stars stf'+contentID+'" id="starRatingForm_' + s_id  + '">' +
                            getStarDrawn(s_id, avr, "You have already voted") +
                        '    </div>' +
                        '</div>' +
                        '<div class="rateCount stc'+contentID+'" id="dummy_countInfo_'+ s_id  + '">'+ countStr +'</div>'
                 );
            }
            //$('#'+targetDivID).html(stars);
            targetHtmlObject.html(stars);
            
            var ratingObject = new Object;
            ratingObject.divID = s_id;
            ratingObject.rate = avr;
            ratingObject.count = count;
            
            this.ratingObjects[contentID] = ratingObject;
            this.formInit(s_id,r_setup);
            initToolTips();                
        },
        
        //Init the star form
        formInit: function (s_id,r_setup){
            $("#ro_starRating_"+s_id).bind("mouseover", function(){
                $(this).hide();            
            });
        
            $("#starRatingForm_"+s_id).bind("mouseout", function(){
                $("#ro_starRating_"+s_id).show();            
            });
        
            $("#starRatingForm_"+s_id).stars({
                oneVoteOnly: true,
                disabled: r_setup.voteDisabled,
                callback: function(ui, type, value) {
                    //$("#loader_"+s_id).show();
                    var siteID = value.split(',')[0];
                    var contentID = value.split(',')[1];
                    var contentType = value.split(',')[2];
                    var rateValue = value.split(',')[3];
                    
                    $.post("/ratings/ratehandler.ashx",
                        {
                            siteID: siteID,
                            widgettype: contentType,
                            contentID: contentID,
                            rate: rateValue
                        },
                        function(ratingData) {
                            if(r_setup.showResult){
                                var avr = ratingData.split(',')[0];
                                var count = ratingData.split(',')[1];
                                if (ratingData == undefined){
                                    var avr = 0
                                    var count = 0;
                                    //var vote_allow = true;
                                } else {
                                    var avr = ratingData.split(',')[0];
                                    var count = ratingData.split(',')[1];
                                    //var vote_allow = ratingData.split(',')[2];
                                }                                    
                                countStr = count + " " + (count <= 1 ? "vote" : "votes"); 
                                //$("#starRatingForm_"+s_id).stars("selectID", avr-1);
                                /*$("#starRatingForm_"+s_id).unbind("mouseout");
                                $("#starRatingForm_"+s_id).hide();
                                $("#ro_starRating_"+s_id).unbind("mouseover");
                                $("#ro_starRating_"+s_id).show();
                                $("#ro_starRating_"+s_id).html(getStarDrawn(s_id, avr, "Thank you for your vote"));
                                $("#countInfo_"+s_id).html(countStr);
                                //Update other info
                                $("#dummy_starRatingForm_"+s_id).html(getStarDrawn(s_id, avr, "Thank you for your vote"));
                                $("#dummy_countInfo_"+s_id).html(countStr);*/
                                $('.stf'+contentID).unbind("mouseout");
                                $('.stf'+contentID).hide();
                                $(".ro"+contentID).unbind("mouseover");
                                $(".ro"+contentID).show();
                                $(".ro"+contentID).html(getStarDrawn(s_id, avr, "Thank you for your vote"));
                                $('.stf'+contentID).html(getStarDrawn(s_id, avr, "Thank you for your vote"));
                                $('.stc'+contentID).html(countStr);
                                $('.dstf'+contentID).html(getStarDrawn(s_id, avr, "Thank you for your vote"));
                                $('.dstc'+contentID).html(countStr);
                                 
                                initToolTips();                                
                            }
                            //$("#loader_"+s_id).hide();
                        }
                    );
                }    
            });
        },
        
        //Return the object of the star
        getRatingInfo: function(contentID){
            return this.ratingObjects[contentID];
        }
        
}
function getStarDrawn(s_id, avr, remark){
    if ( remark === undefined ) {
        return '<div id="ro_fake-stars-off_'+s_id+'" class="stars-off"><div id="ro_fake-stars-on_'+s_id+'" class="stars-on" style="width:'+getCSSwidth(avr)+'px"></div></div>';
    } else{
        return '<div id="ro_fake-stars-off_'+s_id+'" class="stars-off rateTips" remark="'+remark+'"><div id="ro_fake-stars-on_'+s_id+'" class="stars-on rateTips" remark="'+remark+'" style="width:'+getCSSwidth(avr)+'px"></div></div>';
    }
}
function getCSSwidth(rate){
    var CSSlook = new Array();
        CSSlook["0"] = "0";
        CSSlook["0.5"] = "8";
        CSSlook["1"] = "16";
        CSSlook["1.5"] = "24";
        CSSlook["2"] = "32";
        CSSlook["2.5"] = "40";
        CSSlook["3"] = "48";
        CSSlook["3.5"] = "56";
        CSSlook["4"] = "64";
        CSSlook["4.5"] = "72";
        CSSlook["5"] = "80";
    return CSSlook[rate];
}
//Init Tooltips for disable vote
function initToolTips(){
    $(".rateTips").tooltip({
     track: false,
     delay: 0,
     showURL: false,
        fade: 100,
        bodyHandler: function() { 
            return $(this).attr("remark"); 
        } 
    });
 
}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Common JS Script
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Retrieve Single Parameter
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gup( name )
{
  name = name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results === null ) {
    return "";
  } else {
    return results[1];
  }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Usage: writeIFrame('index2.html', 'successPage=/ausidol/login.html', 'height="300 width="300"');
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function writeIFrame(src, params, iframeoptions) {
  var str=window.location.href;
  if (str.indexOf('?') != -1)
  {
        str = (str.substr(str.indexOf('?'), str.length));
  }
  else {
        str='';
  }   
  if (params !== null && params !== '')
  {
     if (str.indexOf('?') != -1) {
          str = str + '&' + params;
     } else { 
          str = '?' + params;
     }
  }
  document.write('<iframe src="' + src + str + '" '+ iframeoptions + '></iframe>');
  
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Usage: writeIFrameExternal('index2.html', 'successPage=/login.html', 'height="300 width="300"');
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function writeIFrameExternal(src, params, iframeoptions) {
  document.write('<iframe src="' + src + '" '+ iframeoptions + '/></iframe>');
  //alert('writeIFrameExternal called from common.js <iframe src="' + src + '" '+ iframeoptions + '/></iframe>' );
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Write Error Messages
//Usage: write error messages on div error_msg
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function writeError(errorMsg)
{
  document.getElementById('error_msg').innerHTML = errorMsg;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//For Header Animated Logo
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function getCookie(c_name)
{
            if (document.cookie.length>0)
              {
              c_start=document.cookie.indexOf(c_name + "=");
              if (c_start!=-1)
                        { 
                        c_start=c_start + c_name.length+1;
                        c_end=document.cookie.indexOf(";",c_start);
                        if (c_end==-1) { c_end=document.cookie.length; }
                                    return unescape(document.cookie.substring(c_start,c_end));
                        } 
              }
            return "";
}
function setCookie(c_name,value,expiredays)
{
            var exdate=new Date();
            exdate.setDate(exdate.getDate()+expiredays);
            document.cookie=c_name+ "=" +escape(value)+((expiredays===null) ? "" : ";expires="+exdate.toGMTString());
}
var cookieName = 'flashSession';
function isNewSession()
{
            if (getCookie(cookieName) == 'true') {
                        return false;
            }
            else {
                        setCookie(cookieName, 'true', null);
                        return true;
            }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Update iframe height
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function updateIFrame( height ) {
   var iframe = document.getElementById( 'iclpFrame' );
   iframe.setAttribute( 'height', height );
   setTimeout('window.stop()',20000);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Validate String for URL
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function validateURL(urlString) {
    var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
    return regexp.test(urlString);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Drop Down/ Overlapping Content- © Dynamic Drive (www.dynamicdrive.com)
// This notice must stay intact for legal use.
// Visit http://www.dynamicdrive.com/ for full source code
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function getposOffset(overlay, offsettype){
    var totaloffset=(offsettype=="left")? overlay.offsetLeft : overlay.offsetTop;
    var parentEl=overlay.offsetParent;
    while (parentEl!==null){
        totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
        parentEl=parentEl.offsetParent;
    }
    return totaloffset;
}
function overlay(curobj, subobjstr, opt_position){
if (document.getElementById){
    var subobj=document.getElementById(subobjstr);
    subobj.style.display=(subobj.style.display!="block")? "block" : "none";
    var xpos=getposOffset(curobj, "left")+((typeof opt_position!="undefined" && opt_position.indexOf("right")!=-1)? -(subobj.offsetWidth-curobj.offsetWidth) : 0);
    var ypos=getposOffset(curobj, "top")+((typeof opt_position!="undefined" && opt_position.indexOf("bottom")!=-1)? curobj.offsetHeight : 0);
    subobj.style.left=xpos+"px";
    subobj.style.top=ypos+"px";
    return false;
}
else {
    return true;
}
}
function overlayclose(subobj){
    document.getElementById(subobj).style.display="none";
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Function for lightbox url params
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function getURLParam(strParamName){
    var strReturn = "";
    var strHref = window.location.href;
    if ( strHref.indexOf("?") > -1 ){
        var strQueryString = strHref.substr(strHref.indexOf("?")).toLowerCase();
        var aQueryString = strQueryString.split("&");
        for ( var iParam = 0; iParam < aQueryString.length; iParam++ ){
            if (
                aQueryString[iParam].indexOf(strParamName.toLowerCase() + "=") > -1 ){
                var aParam = aQueryString[iParam].split("=");
                strReturn = aParam[1];
                break;
            }
        }
    }
    return unescape(strReturn);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// URL encode / decode
// http://www.webtoolkit.info/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var Url = {
    // public method for url encoding
    encode : function (string) {
        return escape(this._utf8_encode(string));
    },
    // public method for url decoding
    decode : function (string) {
        return this._utf8_decode(unescape(string));
    },
    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";
        for (var n = 0; n < string.length; n++) {
            var c = string.charCodeAt(n);
            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
        }
        return utftext;
    },
    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;
        while ( i < utftext.length ) {
            c = utftext.charCodeAt(i);
            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }
        }
        return string;
    }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//End Common JS Script
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
function truncateText(val, maxChars, wholeWords) {
    if (wholeWords == undefined)
        wholeWords = true;
    if (val.length <= maxChars) {
        return val;
    }
    else {
        if (wholeWords) {
            var lastSpace = val.indexOf(' ', maxChars);
            if (lastSpace <= 0)
                lastSpace = maxChars;
            return val.substring(0, lastSpace) + '...';
        }
        else {
            return val.substring(0, maxChars) + '...';
        }
    }
}
 function applyPagination(items, items_per_page, pagination_container) {
    pagination_container.append('<div class="pager"></div>')
    pagination_container = pagination_container.find('.pager');
    
    // first, check if items > page limit
    if (items.length > items_per_page) {
        // Create pagination element
        var pagination = $('<div class="links"></div>');
        pagination_container.append(pagination);
        pagination_container.find('.links').pagination(items.length, {
            items_per_page: items_per_page,
            callback: function (page_id, jq) {
                var top = 0;
                if (items.length < ((page_id * items_per_page) + items_per_page)) { top = items.length; }
                else { top = (page_id * items_per_page) + items_per_page; }
                var count = 0;
                items.each(function () {
                    count++;
                    if ((count < (page_id * items_per_page) + 1) || (count > (page_id * items_per_page) + items_per_page)) {
                        $(this).hide();
                    } else {
                        $(this).show();
                    }
                });
                pagination.find('.links a, .links span').each(function () {
                    if (!isNaN($(this).text())) {
                        var pagenumber = parseInt($(this).text());
                        var startitem = ((pagenumber - 1) * items_per_page) + 1;
                        var enditem = items_per_page * pagenumber;
                        enditem = (enditem > items.length) ? items.length : enditem;
                        $(this).html(startitem + ' - ' + enditem);
                    }
                    else {
                        if ($(this).text() == 'Prev') $(this).html('&lt;&nbsp;Prev');
                        if ($(this).text() == 'Next') $(this).html('Next&nbsp;&gt;');
                    }
                });
                pagination_container.find('p').remove();
                pagination_container.prepend("<p>Showing " + ((page_id * items_per_page) + 1) + "-" + top + " of " + items.length + "</p>");
                pagination_container.find('A').attr('href', 'javascript:;');
            }
        });
        var count = 0;
        items.each(function () {
            count++;
            if ((count < 1) || (count > items_per_page)) {
                $(this).hide();
            } else {
                $(this).show();
            }
        });
    }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Login Script
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function checkCookie(){
  redirectUrl = window.location.href;
  //redirectUrl = "http://www.masterchef.com.au/scripts.js";
  usti=getCookie('TI');
  uname=getCookie('TFN');
  loginURL = "https://memberscrm.ten.com.au/index.cfm?action=registration&amp;pageAction=loginPopup&amp;requestor_id=AAE0C38F-3E82-4374-A0E02ED2121D37BB&redirectto="+redirectUrl+"&keepThis=true&TB_iframe=true&height=520&width=527";
  signupURL = "https://members.ten.com.au/masterchef/register.htm?redirectto=http://www.masterchef.com.au/scripts.js";
  if (usti!=null && usti!=""){
      return ('<div class="logged-in"><span class="username">Hi <a href="https://members.ten.com.au/masterchef/update-profile.htm" title="username">' + uname + '</a></span> <span class="sign-out"><a href="#" class="colorbox-logout" onclick="logout();" title="Log out" id="colorbox-logout">Log Out</a></span></div>')
  } else {
      return ('<div class="not-logged-in"><span class="sign-in"><a href="'+loginURL+'" title="Login" id="colorbox-login">Sign In </a></span> <span class="sign-up"><a href="https://members.ten.com.au/masterchef/register.htm?redirectto='+redirectUrl+'" title="Signup"> Sign Up</a></span></div>')
  }
}
function logout(){
  redirectUrl = window.location.href;
  //redirectUrl = "http://www.masterchef.com.au/scripts.js";
  logoutURL = "http://sso.masterchef.com.au/index.cfm?action=registration_logout&amp;requestor_id=AAE0C38F-3E82-4374-A0E02ED2121D37BB&redirectto="+redirectUrl;
  //ifrm = document.createElement("IFRAME");
  //ifrm.setAttribute("src", "/forums/logout.jsp");
  //document.body.appendChild(ifrm);
  processLogout();
}
function processLogout(){
  var iframe_logout = document.createElement('IFRAME');
  iframe_logout.setAttribute('width', 1);
  iframe_logout.setAttribute('height', 1);
  iframe_logout.setAttribute('src', logoutURL);
  document.body.appendChild(iframe_logout);
}
function openPopup(url, name, args){
  window.open(url, name, args);
  return false;
}
 
function loadMemberPanel()
{
  document.write(checkCookie());
  
  $("#colorbox-login").colorbox({width:"570", height:"510px", iframe:true});
  $('#colorbox-login').click(function () { $('#colorbox').show() }); 
  $(".colorbox-logout").colorbox({width:"410px", height:"205px", inline:true, href:"#hiddenModalContent"});
  $("#members-panel").show("fast");
}/*********************************************************************************************
* 
* NETWORK TEN GENERIC MARQUEE
*
* This file provides a jQuery plugin to create a generic marquee (styled via CSS)
* This plugin requires at least jQuery 1.4.2
*
* + Requirements: video-settings.js file which contains app config settings
* + Author: A. Tadros (Network TEN Digital Media)
* + Version: 1.0
*
*********************************************************************************************/
jQuery.fn.marquee = function (options) {
    var activeMarquee = 0;
    var marquee_player;
    var autoScroll;
    var adsOnly = false;
    var videoPlaying = false;
    // default settings
    var defaults = {
        xmlfile: '',
        maxitems: 0,
        speed: 4000,
        carousel: false,
        coverflow: false,
        thumbnailhover: true,
        linkheadline: false,
        moreText: '',
        moreVideoText: '',
        titleCharLimit: 0,
        descriptionCharLimit: 0,
        ads: []
    }
    // get settings passed to the function
    var o = $.extend(defaults, options);
    // create html template
    var container = this;
    container.html(
        '<div class="marquee">' +
            '<div id="marquee-video-container">' +
                '<div id="marquee-video"></div>' +
            '</div>' +
            '<div class="marquee-overlay1"></div>' +
            '<div class="marquee-overlay2"></div>' +
            '<div class="marquee-overlay3"></div>' +
            '<div class="marquee-items-wrapper">' +
                '<div class="marquee-items"><ul></ul></div>' +
            '</div>' +
            '<div class="marquee-thumbnails-wrapper">' +
                '<div class="marquee-thumbnails-inner">' +
                    '<a class="marquee-thumbnail-arrow-left"></a>' +
                    '<div class="marquee-thumbnails"><ul></ul></div>' +
                    '<a class="marquee-thumbnail-arrow-right"></a>' +
                '</div>' +
            '</div>' +
            '<div class="marquee-thumbnails-hidden" style="display:none"></div>' +
            '<a class="marquee-thumbnails-hidden-next" style="display:none;"></a>' +
            '<a class="marquee-thumbnails-hidden-prev" style="display:none;"></a>' +
        '</div>'
    );
    var thumbnailImages = new Array();
    if (o.xmlfile != '') {
        // read xml file
        $.ajax({
            type: "GET",
            url: o.xmlfile,
            dataType: "xml",
            async: false,
            error: function () { /* do nothing */ },
            success: function (xml) {
                createMarqueeItems(o, xml);
                createAds(o);
                finaliseMarquee(o);
            }
        });
    }
    else {
        adsOnly = true;
        createAds(o);
        finaliseMarquee(o);
    }
    function createMarqueeItems(o, xml) {
        $(xml).find('window').each(function (index) {
            if (o.maxitems < 1 || index < o.maxitems) {
                var obj = new Object();
                obj.title = $(this).find('headline').text();
                obj.description = $(this).find('bodytext').text();
                obj.imageurl = $(this).find('imageURL').text();
                obj.linkurl = $(this).find('targetURL').text();
                obj.thumburl = $(this).find('thumbURL').text();
                obj.thumbTitle = $(this).find('thumbheadline').text();
                obj.thumbText = $(this).find('thumbtext').text();
                obj.mediaType = $(this).find('mediaType').text();
                obj.mediaid = $(this).find('mediaid').text();
                obj.videoquery = $(this).find('videoquery').text();
                // adjust values
                obj.title = obj.title.replace('           ', '<br />');
                if (obj.thumburl == '') { obj.thumburl = obj.imageurl; }
                if (obj.thumbTitle == '') { obj.thumbTitle = obj.title; }
                // create slide
                var li = createSlide(obj);
                li.addClass('slide');
                container.find('.marquee-items UL').append(li);
                // create thumbnail
                var thumb_li = createThumbnail(obj);
                thumb_li.addClass('slide');
                container.find('.marquee-thumbnails UL').append(thumb_li);
                // create hidden thumbnail
                var hidden_thumb = $('<a class="slide"></a>');
                hidden_thumb.append('slide' + index);
                container.find('.marquee-thumbnails-hidden').append(hidden_thumb);
            }
        });
    }
    function createSlide(obj) {
        var li = $(
            '<li>' +
                '<div class="marquee-item">' +
                    '<a class="marquee-image"><img /></a>' +
                    '<div class="marquee-text">' +
                        '<div class="marquee-text-overlay"></div>' +
                        '<div class="marquee-text-area">' +
                            '<div class="marquee-text-headline"></div>' +
                            '<div class="marquee-text-bodytext"></div>' +
                            '<a href="#" class="marquee-text-button"></a>' +
                        '</div>' +
                    '</div>' +
                '</div>' +
            '</li>');
        if (obj.mediaType == 'media') {
            li.find('.marquee-item').prepend('<a class="marquee-play-icon"></a>');
        }
        if (o.linkheadline) {
            li.find('.marquee-text-headline').append('<a></a>');
            li.find('.marquee-text-headline A').append(obj.title);
        }
        else {
            li.find('.marquee-text-headline').append(obj.title);
        }
        li.find('.marquee-text-bodytext').append(obj.description);
        li.find('.marquee-image IMG').attr('src', obj.imageurl);
        li.find('a').attr('href', obj.linkurl);
        if (obj.mediaType == 'media' && o.moreVideoText != '') {
            li.find('.marquee-text-button').append(o.moreVideoText);
        }
        else {
            li.find('.marquee-text-button').append(o.moreText);
        }
        if (obj.mediaType == 'media') {
            li.find('a').not('.marquee-text-button').removeAttr('href').click(function () {
                playMarqueeVideo(obj.mediaid);
            });
        }
        if (o.titleCharLimit > 0) {
            li.find('.marquee-text-headline').limitCharacters(o.titleCharLimit);
        }
        if (o.descriptionCharLimit > 0) {
            li.find('.marquee-text-bodytext').limitCharacters(o.descriptionCharLimit);
        }
        if (obj.videoquery != '') {
            var params = createVideoParams({
                query: obj.videoquery,
                tags: false
            });
            obj.videoquery = obj.videoquery.split('?')[0];
            getMediaList({
                query: obj.videoquery,
                params: params,
                imageSize: '600x338',
                callback: function (mediaList) {
                    if (mediaList.length > 0) {
                        var media = mediaList[0];
                        if (obj.title == '') { li.find('.marquee-text-headline').html(media.title); }
                        if (obj.description == '') { li.find('.marquee-text-bodytext').html(media.description); }
                        if (obj.imageurl == '') { li.find('.marquee-image IMG').attr('src', media.imageurl); }
                    }
                }
            });
        }
        return li;
    }
    function createThumbnail(obj) {
        var thumb_li;
        if (!o.coverflow) {
            thumb_li = $(
                '<li>' +
                    '<div class="marquee-thumbnail">' +
                        '<a class="marquee-thumbnail-image"><img /></a>' +
                        '<div class="marquee-thumbnail-text">' +
                            '<div class="marquee-thumbnail-text-headline"></div>' +
                            '<div class="marquee-thumbnail-text-bodytext"></div>' +
                        '</div>' +
                    '</div>' +
                '</li>');
        }
        else {
            thumb_li = $(
                '<li class="item">' +
                    '<img class="marquee-thumbnail-image content" />' +
                    '<div class="caption">' +
                        '<div class="marquee-thumbnail-text-headline"></div>' +
                        '<div class="marquee-thumbnail-text-bodytext"></div>' +
                    '</div>' +
                '</li>');
        }
        thumb_li.find('.marquee-thumbnail-image IMG, IMG.marquee-thumbnail-image').attr('src', obj.thumburl);
        thumb_li.find('.marquee-thumbnail-text-headline').html(obj.thumbTitle);
        thumb_li.find('.marquee-thumbnail-text-bodytext').html(obj.thumbText);
        thumb_li.hover(
            function () { if (!($(this).hasClass('active'))) $(this).addClass('hover'); },
            function () { $(this).removeClass('hover'); }
        );
        if (obj.videoquery != '') {
            var params = createVideoParams({
                query: obj.videoquery,
                tags: false
            });
            obj.videoquery = obj.videoquery.split('?')[0];
            getMediaList({
                query: obj.videoquery,
                params: params,
                imageSize: '600x338',
                callback: function (mediaList) {
                    if (mediaList.length > 0) {
                        var media = mediaList[0];
                        if (obj.title == '') { thumb_li.find('.marquee-thumbnail-text-headline').html(media.title); }
                        if (obj.description == '') { thumb_li.find('.marquee-thumbnail-text-bodytext').html(media.description); }
                        if (obj.imageurl == '') { thumb_li.find('.marquee-thumbnail-image IMG, IMG.marquee-thumbnail-image').attr('src', media.imageurl); }
                    }
                }
            });
        }
        var thumbnailImage = new Image(100, 55);
        thumbnailImage.src = obj.thumburl;
        thumbnailImages[thumbnailImages.length] = thumbnailImage;
        return thumb_li;
    }
    function parseMarqueeAd(xml) {
        if (xml.indexOf('<window>') > -1) {
            var obj = new Object();
            obj.title = extractXMLValue(xml, 'headline');
            obj.description = extractXMLValue(xml, 'bodytext');
            obj.imageurl = extractXMLValue(xml, 'imageURL');
            obj.linkurl = extractXMLValue(xml, 'targetURL');
            obj.thumburl = extractXMLValue(xml, 'thumbURL');
            obj.thumbTitle = extractXMLValue(xml, 'thumbheadline');
            obj.thumbText = extractXMLValue(xml, 'thumbtext');
            obj.mediaType = extractXMLValue(xml, 'mediaType');
            obj.mediaid = extractXMLValue(xml, 'mediaid');
            obj.adCounter = extractXMLValue(xml, 'adCounter');
            // adjust values
            obj.title = obj.title.replace('           ', '<br />');
            if (obj.thumburl == '') { obj.thumburl = obj.imageurl; }
            if (obj.thumbTitle == '') { obj.thumbTitle = obj.title; }
            // calcualate position
            var total = container.find('.marquee-items UL LI.slide').length;
            var position = (o.ads[i].position > total) ? total - 1 : o.ads[i].position - 1;
            // create ad slide
            var li = createSlide(obj);
            var thumb_li = createThumbnail(obj);
            var hidden_thumb = $('<a></a>');
            hidden_thumb.append('ad' + i);
            li.addClass('ad');
            thumb_li.addClass('ad');
            if (obj.adCounter != '') {
                var hiddenAdCounter = $('<input type="hidden" class="adCounter" />');
                hiddenAdCounter.val(obj.adCounter);
                li.append(hiddenAdCounter);
            }
            if (!adsOnly) {
                var target_li = $(container.find('.marquee-items UL LI.slide')[position]);
                target_li.after(li);
                // create ad thumbnail
                var target_thumb_li = $(container.find('.marquee-thumbnails UL LI.slide')[position]);
                target_thumb_li.after(thumb_li);
                // create hidden thumbnail
                var target_hidden_thumb = $(container.find('.marquee-thumbnails-hidden A.slide')[position]);
                target_hidden_thumb.after(hidden_thumb);
            }
            else {
                container.find('.marquee-items UL').append(li);
                container.find('.marquee-thumbnails UL').append(thumb_li);
                container.find('.marquee-thumbnails-hidden').append(hidden_thumb);
            }
        }
    }
    function playMarqueeVideo(mediaid) {
        if (marquee_player == undefined) {
            $('#marquee-video-container, #marquee-video').show().css('visibility', 'visible');
            var width = $('#marquee-video').width();
            var height = $('#marquee-video').height();
            marquee_player = movideoplayer.embedPlayer('marquee-video', moVideoSettings['appName'], moVideoSettings['apiKey'], width, height, { mediaId: mediaid });
        }
        else {
            var currentMediaID = '';
            var queue = marquee_player.getQueue();
            if (queue.length > 0)
                currentMediaID = queue[0].id;
            if (currentMediaID == mediaid)
                marquee_player.resume();
            else
                marquee_player.playMedia(mediaid);
        }
        clearInterval(autoScroll);
        videoPlaying = true;
        return false;
    }
    function stopMarqueeVideo() {
        videoPlaying = false;
        marquee_player = undefined;
        $('#marquee-video-container').html('<div id="marquee-video"></div>');
    }
    function extractXMLValue(xml, tagname) {
        var x = xml.match(new RegExp('<' + tagname + '>(.*?)</' + tagname + '>'));
        if (x != null && x[1] != null) {
            var data = x[1];
            if (data.indexOf('<![CDATA[') == 0) {
                data = data.substring(9, data.length - 3);
            }
            return data;
        }
        else {
            return '';
        }
    }
    function finaliseMarquee(o) {
        var hiddenLinks = container.find('.marquee-thumbnails-hidden A');
        var hiddenNext = container.find('.marquee-thumbnails-hidden-next');
        var hiddenPrev = container.find('.marquee-thumbnails-hidden-prev');
        container.find('.marquee-thumbnails UL LI:first').addClass('active');
        // apply carousel functionality to main slides
        container.find('.marquee-items').jCarouselLite({
            //auto: o.speed,
            speed: 0,
            circular: true,
            vertical: true,
            visible: 1,
            scroll: 1,
            btnGo: hiddenLinks,
            btnNext: hiddenNext,
            btnPrev: hiddenPrev,
            beforeStart: function (obj) {
                obj.parent().stop();
                obj.parent().fadeTo(0, 0);
            },
            afterEnd: function (obj) {
                thumbIndex = obj.index();
                var totalItems = obj.parent().find('li').length;
                if (obj.index() == 0) {
                    thumbIndex = container.find('.marquee-thumbnails LI').length;
                }
                else {
                    if (thumbIndex >= totalItems - 1) {
                        thumbIndex = 1;
                    }
                }
                var thumbnails = container.find('.marquee-thumbnails LI');
                var thumbnail = container.find('.marquee-thumbnails LI:nth-child(' + thumbIndex + ')');
                thumbnails.removeClass('active');
                thumbnail.addClass('active');
                obj.parent().fadeTo(300, 1);
                activeMarquee = obj.index() - 1;
                if (o.speed > 0) {
                    clearInterval(autoScroll);
                    autoScroll = setInterval(function () {
                        container.find('.marquee-thumbnails-hidden-next').click();
                    }, o.speed);
                }
                if (o.coverflow) {
                    coverFlow.moveTo(obj.index() - 1);
                }
                if (obj.hasClass('ad')) {
                    var adCounter = obj.find('.adCounter');
                    if (adCounter.length > 0) {
                        //$.post(adCounter.val());
                        var iframe = $('<iframe style="display:none;"></iframe>');
                        iframe.attr('src', adCounter.val());
                        $('BODY').prepend(iframe);
                        // remove adCounter to only fire this once
                        adCounter.remove();
                    }
                }
            }
        });
        if (o.speed > 0) {
            //simulate autoscroll by simulating "click" on next link
            autoScroll = setInterval(function () {
                container.find('.marquee-thumbnails-hidden-next').click();
            }, o.speed);
        }
        // apply carousel to thumbnails
        if (o.carousel) {
            container.find('.marquee-thumbnails').jCarouselLite({
                auto: 0,
                speed: 500,
                visible: 4,
                scroll: 1,
                circular: false,
                pauseOnHover: false,
                btnNext: container.find('.marquee-thumbnail-arrow-right'),
                btnPrev: container.find('.marquee-thumbnail-arrow-left')
            });
        }
        else {
            container.find('.marquee-thumbnail-arrow-right').click(function () { hiddenNext.click(); });
            container.find('.marquee-thumbnail-arrow-left').click(function () { hiddenPrev.click(); });
        }
        container.find('.marquee-thumbnails LI').click(function (e) {
            stopMarqueeVideo();
            if ($(this).index() != activeMarquee) {
                $(hiddenLinks[$(this).index()]).click();
            }
        });
        container.find('.marquee-thumbnails-hidden A').click(function (e) { });
        // trigger slide when hover over thumbnails
        if (o.thumbnailhover) {
            container.find('.marquee-thumbnails LI').mouseenter(function (e) {
                e.stopPropagation();
                if ($(this).index() != activeMarquee) {
                    $(hiddenLinks[$(this).index()]).click();
                    container.find('.marquee-items').stop();
                    container.find('.marquee-thumbnails LI').removeClass('active');
                    $(this).addClass('active');
                }
            });
        }
        // on load function
        if (o.onload) {
            o.onload(container);
        }
    }
    function createAds(o) {
        // loop through ads
        for (i = 0; i < o.ads.length; i++) {
            $.ajax({
                type: "GET",
                url: o.ads[i].url,
                dataType: "text",
                error: function () { /* do nothing */ },
                async: false,
                success: parseMarqueeAd
            });
        }
    }
};
$.fn.limitCharacters = function (maxChars) {
    var wholeWords = false;
    this.each(function () {
        var val = $(this).text();
        $(this).attr('title', val);
        if (val.length <= maxChars) {
            return;
        }
        else {
            if (wholeWords) {
                var lastSpace = val.indexOf(' ', maxChars);
                if (lastSpace <= 0)
                    lastSpace = maxChars;
                val = val.substring(0, lastSpace) + '...';
            }
            else {
                val = val.substring(0, maxChars) + '...';
            }
        }
        $(this).text(val);
    });
};/*********************************************************************************************
* 
* NETWORK TEN MO-VIDEO COMMON CODE BASE 
*
* This file provides all jQuery plugins required for creating Network Ten video widgets.
* This plugin requires at least jQuery 1.4.2
*
* + Requirements: video-settings.js file which contains app config settings
* + Author: A. Tadros (Network TEN Digital Media)
* + Version: 2.6
*
* Added: 'first' and 'last' classes added to video list items
* Added: Universal player communicating with flash tree view
* Added: EM tracking for universal player
* Added: Mini Marquee functionality
* Major Upgrade: 2.0: Update to JSON parsing to allow for proxy pass and JSONP method
* Added: Ability to disable player for iphone users
* Added: Ability to show a tag value (e.g. show name) in video function
* Added: Video Scroller function
* Added: adProxyPath value for use on iPad
* Added: companion flash ads to be wmode = transparent
* Added: ability to shuffle items in video scroller + fixed show tag functionality
* Added: ability to specify date format for widgets
*********************************************************************************************/
/* ---------------------------------------------------------------------------------------- */
/* DATE FORMAT 1.2.3
/* ---------------------------------------------------------------------------------------- */
var dateFormat = function () { var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g, timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g, timezoneClip = /[^-+\dA-Z]/g, pad = function (val, len) { val = String(val); len = len || 2; while (val.length < len) val = "0" + val; return val; }; return function (date, mask, utc) { var dF = dateFormat; if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) { mask = date; date = undefined; } date = date ? new Date(date) : new Date; if (isNaN(date)) throw SyntaxError("invalid date"); mask = String(dF.masks[mask] || mask || dF.masks["default"]); if (mask.slice(0, 4) == "UTC:") { mask = mask.slice(4); utc = true; } var _ = utc ? "getUTC" : "get", d = date[_ + "Date"](), D = date[_ + "Day"](), m = date[_ + "Month"](), y = date[_ + "FullYear"](), H = date[_ + "Hours"](), M = date[_ + "Minutes"](), s = date[_ + "Seconds"](), L = date[_ + "Milliseconds"](), o = utc ? 0 : date.getTimezoneOffset(), flags = { d: d, dd: pad(d), ddd: dF.i18n.dayNames[D], dddd: dF.i18n.dayNames[D + 7], m: m + 1, mm: pad(m + 1), mmm: dF.i18n.monthNames[m], mmmm: dF.i18n.monthNames[m + 12], yy: String(y).slice(2), yyyy: y, h: H % 12 || 12, hh: pad(H % 12 || 12), H: H, HH: pad(H), M: M, MM: pad(M), s: s, ss: pad(s), l: pad(L, 3), L: pad(L > 99 ? Math.round(L / 10) : L), t: H < 12 ? "a" : "p", tt: H < 12 ? "am" : "pm", T: H < 12 ? "A" : "P", TT: H < 12 ? "AM" : "PM", Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""), o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4), S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10] }; return mask.replace(token, function ($0) { return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1); }); }; } (); dateFormat.masks = { "default": "ddd mmm dd yyyy HH:MM:ss", shortDate: "m/d/yy", mediumDate: "mmm d, yyyy", longDate: "mmmm d, yyyy", fullDate: "dddd, mmmm d, yyyy", shortTime: "h:MM TT", mediumTime: "h:MM:ss TT", longTime: "h:MM:ss TT Z", isoDate: "yyyy-mm-dd", isoTime: "HH:MM:ss", isoDateTime: "yyyy-mm-dd'T'HH:MM:ss", isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'" }; dateFormat.i18n = { dayNames: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], monthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] }; Date.prototype.format = function (mask, utc) { return dateFormat(this, mask, utc); };
/* ---------------------------------------------------------------------------------------- */
/* LIMIT CHARACTERS (TRUNCATION)
/* ---------------------------------------------------------------------------------------- */
jQuery.fn.limitCharacters = function (maxChars) { var wholeWords = false; this.each(function () { var val = $(this).text(); $(this).attr('title', val); if (val.length <= maxChars) { return; } else { if (wholeWords) { var lastSpace = val.indexOf(' ', maxChars); if (lastSpace <= 0) lastSpace = maxChars; val = val.substring(0, lastSpace) + '...'; } else { val = val.substring(0, maxChars) + '...'; } } $(this).text(val); }); };
/* ---------------------------------------------------------------------------------------- */
/* MO-VIDEO TOKEN
/* ---------------------------------------------------------------------------------------- */
if (typeof (window['MOVIDEO']) != "undefined") {
    
    // default omit fields
    var omit = ["lastModifiedDate", "copyright", "cuePointsExist", "isAdvertisement", "ratio", "creator", "tagProfileId", "imageFilename", "mediaFileExists", "syndicated", "mediaSchedules", "displayStatus", "syndicatedPartners", "length", "podcastSupported", "tagProfile", "filename", "status", "defaultImage"];
    MOVIDEO.media.setOmittedFields(omit);
    // set up mo-video token when the page loads
    if (videoSettings.jsonp) {
        
        // if using jsonp method, do not specify api path
        MOVIDEO.init({
            appAlias: videoSettings.appName,
            apiKey: videoSettings.apiKey
        });
    }
    else {
        MOVIDEO.init({
            appAlias: videoSettings.appName,
            apiKey: videoSettings.apiKey,
            api: videoSettings.apiUrl
        });
    }
}
function getMovideoToken() {
    var token = '';
    if (typeof (window['MOVIDEO']) != "undefined") {
        if (MOVIDEO.utils != undefined) {
            var token = MOVIDEO.utils.getToken();
            if (token == null || token == undefined) {
                token = '';
            }
        }
    }
    return token;
}
/* ---------------------------------------------------------------------------------------- */
/* VIDEO LIST
/* ---------------------------------------------------------------------------------------- */
// this function is used to generate a html response given a movideo query
jQuery.fn.videos = function (options) {
    var content = this;
    // show loading div
    content.append('<div class="loading"></div>');
    // default settings
    var defaults = {
        query: '',
        maxvideos: 0,
        showdate: false,
        showdescription: true,
        showrating: false,
        showduration: true,
        pagination: false,
        imageSize: '128x72',
        pagesize: 0,
        headerCharLimit: 35,
        descriptionCharLimit: 65,
        dontTruncateFirstItem: false,
        videoPageUrl: videoSettings.videoPageURL,
        tags: '',
        showtag: '',
        dateFormat: "d/mm/yyyy",
        datePrefix: ""
    }
    // get settings passed to the function
    var o = $.extend(defaults, options);
    // create param array
    var params = createVideoParams({
        query: o.query,
        maxvideos: o.maxvideos
    });
    // remove query string params from query
    var query = (o.query.indexOf('?') > -1) ? o.query.split('?')[0] : o.query;
    if (o.tags != '') {
        params.push({ name: 'tags', value: o.tags });
    }
    // call api to retrieve videos
    getMediaList({
        query: query,
        params: params,
        imageSize: o.imageSize,
        videoPageUrl: o.videoPageUrl,
        callback: function (mediaList) {
            // start building list of videos
            var ul = $('<ul class="video-panel"></ul>');
            // loop through each media item in json
            for (i = 0; i < mediaList.length; i++) {
                // check if max videos has been reached (if maxvideos = 0, then no limit)
                if (o.maxvideos < 1 || o.maxvideos > i) {
                    // create list item
                    var li = $(
                        '<li class="item">' +
                            '<a class="image">' +
                                '<img border="0" width="145" height="81" />' +
                                '<div class="play-icon"></div>' +
                                '<div class="tag"></div>' +
                            '</a>' +
                            '<div class="text">' +
                                '<div class="header"><a></a></div>' +
                                '<div class="tag"></div>' +
                                '<div class="details"></div>' +
                                '<p></p>' +
                            '<div>' +
                        '</li>');
                    // append data to list item
                    li.addClass('item' + i);
                    if (i == 0) { li.addClass('first'); }
                    if (i == (mediaList.length - 1)) { li.addClass('last'); }
                    li.find('a').attr('href', mediaList[i].link);
                    li.find('a').attr('title', mediaList[i].title);
                    li.find('.header a').append(mediaList[i].title);
                    li.find('img').attr('src', mediaList[i].imageurl);
                    li.attr('mediaid', mediaList[i].id);
                    li.attr('playlistid', mediaList[i].playlistid);
                    if (o.showtag != '') {
                        var tag = getTagValue(mediaList[i], o.showtag);
                        li.find('.tag').append(tag);
                    }
                    if (o.showdate) {
                        if (mediaList[i].date != undefined) {
                            var formattedDate = dateFormat(mediaList[i].date, o.dateFormat);
                            li.find('.details').append(o.datePrefix + formattedDate);
                        }
                    }
                    if (o.showduration) {
                        if (mediaList[i].duration != undefined) {
                            li.find('.details').append('(' + mediaList[i].duration + ')');
                        }
                    }
                    if (o.showdescription) {
                        if (mediaList[i].description != undefined) {
                            li.find('p').append(mediaList[i].description);
                        }
                    }
                    // append star ratings
                    if (o.showrating) {
                        // TO-DO: star ratings
                    }
                    // append item to list
                    ul.append(li);
                }
            }
            // append list to container
            content.html(ul);
            // initialise elements (text limits)
            if (o.headerCharLimit > 0) {
                var items = (o.dontTruncateFirstItem) ? content.find('.item .header a').not(content.find('.item:first .header a')) : content.find('.item .header a');
                items.limitCharacters(o.headerCharLimit);
            }
            if (o.descriptionCharLimit > 0) {
                var items = (o.dontTruncateFirstItem) ? content.find('.item p').not(content.find('.item:first p')) : content.find('.item p');
                items.limitCharacters(o.descriptionCharLimit);
            }
            // do onload function if one is specified
            if (o.onload != undefined)
                o.onload();
            // apply pagination if configured
            if (o.pagination) {
                var items = content.find('.item');
                var items_per_page = o.pagesize;
                videoPagination(items, items_per_page, o.pagination_container);
            }
        }
    });
};

/* ---------------------------------------------------------------------------------------- */
/* GET LIST OF MEDIA
/* ---------------------------------------------------------------------------------------- */
function getMediaList(options) {
    // default settings
    var defaults = {
        query: '',
        params: [],
        async: true,
        imageSize: '128x96',
        videoPageUrl: videoSettings.videoPageURL,
        callback: function () { }
    }
    // get settings passed to the function
    var o = $.extend(defaults, options);
    // get data from movideo using api
    MOVIDEO.media.callAPI({
        endpoint: o.query,
        params: o.params,
        async: o.async,
        errorHandler: function () {
            // when there is an error, create an empty array
            var mediaList = [];
            o.callback(mediaList);
        },
        handler: function (response) {
            // convert response into a standard array of media items
            var mediaList = convertResponseToMediaList({
                response: response,
                query: o.query,
                imageSize: o.imageSize,
                videoPageUrl: o.videoPageUrl
            });
            // call callback function
            if (response.totalItems != undefined)
                o.callback(mediaList, response.totalItems);
            else
                o.callback(mediaList);
        }
    });
}
/* ---------------------------------------------------------------------------------------- */
/* CONVERT MOVIDEO RESPONSE TO ARRAY OF MEDIA ITEMS
/* ---------------------------------------------------------------------------------------- */
function findJSONobjects(response, name) {
    var mediaList = [];
    findJSONobjects(response, name);
    return mediaList;
    function findJSONobjects(object, name) {
        if (name in object) {
            if ($.isArray(object[name])) {
                $.each(object[name], function (index, value) {
                    mediaList.push(value);
                });
            }
            else {
                mediaList.push(object[name]);
            }
        }
        for (key in object) {
            if ((typeof (object[key])) == 'object') {
                findJSONobjects(object[key], name);
            }
        }
    }
}
function convertResponseToMediaList(options) {
    var defaults = {
        response: '',
        query: '',
        imageSize: '128x96',
        videoPageUrl: videoSettings.videoPageURL
    };
    var o = $.extend(defaults, options);
    var response = o.response;
    var mediaList = [];
    var validResponse = false;
    if (response != undefined) {
        if (response != "") {
            validResponse = true;
        }
    }
    if (validResponse) {
        mediaList = findJSONobjects(response, "media");        
    }
    // loop through media items
    for (i = 0; i < mediaList.length; i++) {
        // format duration;
        if (mediaList[i].duration != undefined) {
            var seconds = parseInt(mediaList[i].duration);
            var hours = parseInt(seconds / 3600);
            var minutes = parseInt((seconds / 60) - (hours * 60));
            if (seconds == 60) {
                seconds = 0;
                minutes++;
            }
            if (minutes == 60) {
                minutes = 0;
                hours++;
            }
            seconds = seconds % 60;
            // format new duration => h:mm:ss
            var dur = seconds;
            if (dur.length == 1) { dur = '0' + dur; }
            dur = minutes + ':' + seconds;
            if (hours > 0) {
                if (minutes.length == 1) { dur = '0' + dur; }
                dur = hours + ':' + dur;
            }
            // update duration in array item
            mediaList[i].duration = dur;
        }
        else {
            var tagDuration = getTagValue(mediaList[i], 'duration:time');
            if (tagDuration != undefined) {
                if (tagDuration.indexOf('00:') == 0 && tagDuration.length >= 7) {
                    tagDuration = tagDuration.substring(3, tagDuration.length);
                }
                mediaList[i].duration = tagDuration;
            }
        }

        // get the media's creation date
        var dateArr = mediaList[i].creationDate.split('T')[0].split('-');
        var timeArr = mediaList[i].creationDate.split('T')[1].split(':');
        var d = new Date(dateArr[0], dateArr[1] - 1, dateArr[2], timeArr[0], timeArr[1]);
        // IMPORTANT: add 10 hours to date for GMT/Australian time conversion
        d.setHours(d.getHours() + 10);
        mediaList[i].date = d;
        // store short/long date in array item
        //mediaList[i].date = dateFormat(d, "d/mm/yyyy");
        //mediaList[i].longdate = dateFormat(d, "dS mmmm yyyy h:MM TT");
        // add link url to array item
        mediaList[i].link = o.videoPageUrl + "?" + videoSettings.mediaParam + "=" + mediaList[i].id;
        var playlistid = extractPlaylistId(o.query);
        if (playlistid != null) {
            mediaList[i].link += "&" + videoSettings.playlistParam + "=" + playlistid;
            mediaList[i].playlistid = playlistid;
        }
        else {
            if (mediaList[i].playlistid != undefined) {
                mediaList[i].link += "&" + videoSettings.playlistParam + "=" + mediaList[i].playlistid;
            }
        }
        // add image url to array item
        mediaList[i].imageurl = mediaList[i].imagePath + 'cropped/' + o.imageSize + '.png';
    }
    return mediaList;
}

/* ---------------------------------------------------------------------------------------- */
/* PAGINATION
/* ---------------------------------------------------------------------------------------- */
function videoPagination(items, items_per_page, pagination_container) {
    // first, check if items > page limit
    if (items.length > items_per_page) {
        // Create pagination element
        var pagination = $('<div class="links"></div>');
        pagination_container.append(pagination);
        pagination_container.find('.links').pagination(items.length, {
            items_per_page: items_per_page,
            callback: function (page_id, jq) {
                var top = 0;
                if (items.length < ((page_id * items_per_page) + items_per_page)) { top = items.length; }
                else { top = (page_id * items_per_page) + items_per_page; }
                var count = 0;
                items.each(function () {
                    count++;
                    if ((count < (page_id * items_per_page) + 1) || (count > (page_id * items_per_page) + items_per_page)) {
                        $(this).hide();
                    } else {
                        $(this).show();
                    }
                });
                pagination.find('.links a, .links span').each(function () {
                    if (!isNaN($(this).text())) {
                        var pagenumber = parseInt($(this).text());
                        var startitem = ((pagenumber - 1) * items_per_page) + 1;
                        var enditem = items_per_page * pagenumber;
                        enditem = (enditem > items.length) ? items.length : enditem;
                        $(this).html(startitem + ' - ' + enditem);
                    }
                    else {
                        if ($(this).text() == 'Prev') $(this).html('&lt;&nbsp;Prev');
                        if ($(this).text() == 'Next') $(this).html('Next&nbsp;&gt;');
                    }
                });
                pagination_container.find('p').remove();
                pagination_container.prepend("<p>Showing " + ((page_id * items_per_page) + 1) + "-" + top + " of " + items.length + "</p>");
                pagination_container.find('A').attr('href', 'javascript:;');
            }
        });
        var count = 0;
        items.each(function () {
            count++;
            if ((count < 1) || (count > items_per_page)) {
                $(this).hide();
            } else {
                $(this).show();
            }
        });
    }
}


/* ---------------------------------------------------------------------------------------- */
/* HELPER FUNCTIONS
/* ---------------------------------------------------------------------------------------- */
function extractPlaylistId(query) {
    var playlistid = query.match("playlist/(.*?)/media");
    if (playlistid != null) {
        if (playlistid[1] != null) {
            if (!isNaN(playlistid[1])) {
                return playlistid[1];
            }
        }
    }
    return null;
}
function createVideoParams(options) {
    // default settings
    var defaults = {
        query: '',
        maxvideos: 0,
        tags: true
    }
    // get settings passed to the function
    var o = $.extend(defaults, options);
    var params = new Array();
    // omit unneccessary fields for performance
    var omitFields = 'ratio,creator,tagProfileId,mediaFileExists,syndicated,mediaSchedules,displayStatus,syndicatedPartners,encodingProfiles,client,filename,status,defaultImage';
    if (!o.tags) { omitFields += ',tags'; }
    params[params.length] = { name: 'omitFields', value: omitFields };
    // limit videos
    if (o.maxvideos > 0) {
        if (o.query.indexOf('playlist') > -1) {
            params[params.length] = { name: 'mediaLimit', value: o.maxvideos };
        }
        else {
            params[params.length] = { name: 'paged', value: 'true' };
            params[params.length] = { name: 'page', value: '0' };
            params[params.length] = { name: 'pageSize', value: o.maxvideos };
        }
    }
    // add order by
    params[params.length] = { name: 'orderBy', value: 'creationdate' };
    params[params.length] = { name: 'orderDesc', value: 'true' };
    // check query for querystring variables
    if (o.query.indexOf('?') > -1) {
        var querystring = o.query.split('?')[1];
        var queryArray = querystring.split('&');
        for (x = 0; x < queryArray.length; x++) {
            var valArray = queryArray[x].split('=');
            // check if the key already exists in the params array
            var exists = false;
            for (i = 0; i < params.length; i++) {
                // if it exists, replace the current value
                if (params[i].name == valArray[0]) {
                    exists = true;
                    params[i].value = valArray[1];
                }
            }
            // otherwise, add a new param
            if (!exists) {
                params[params.length] = { name: valArray[0], value: valArray[1] };
            }
        }
    }
    return params;
}

/* ---------------------------------------------------------------------------------------- */
/* ADS
/* ---------------------------------------------------------------------------------------- */
/*
var movideoAds = {
    advertChangedCallback: function (advertData) {
        var pattern = /image/;
        for (x in advertData.companionAds) {
            var y = advertData.companionAds[x];
            if (y.width == 468) {
                var midleaderboard = document.getElementById('leave-behind-wrapper');
                if (pattern.test(y.creativeType)) {
                    midleaderboard.innerHTML = '<a href="' + y.clickThroughUrl + '"><img border="0" width="468" height="60" src="' + y.mediaUrl + '"></a>';
                }
                else {
                    midleaderboard.innerHTML = '<object width="468" height="60"><param name="movie" value="' + y.mediaUrl + '"><embed src="' + y.mediaUrl + '" width="468" height="60"></embed></object>';
                }
            }
            else if (y.width == 300) {
                var mrec = document.getElementById('mrec');
                if (pattern.test(y.creativeType)) {
                    mrec.innerHTML = '<a href="' + y.clickThroughUrl + '"><img border="0" width="300" height="250" src="' + y.mediaUrl + '"></a>';
                }
                else {
                    mrec.innerHTML = '<object width="300" height="250"><param name="movie" value="' + y.mediaUrl + '?clickTAG=' + y.clickThroughUrl + '"><embed src="' + y.mediaUrl + '?clickTAG=' + y.clickThroughUrl + '" width="300" height="250"></embed></object>';
                }
                movideoAds.showMrec();
            }
        }
    },
    controlsEnabledCallback: function (showing) {
        if (showing) {
            movideoAds.hideMrec();
        }
        else {
            movideoAds.showMrec();
        }
    },
    showMrec: function () {
        var mrec = document.getElementById('mrec-wrapper');
        var dirWrapper = document.getElementById('directory-wrapper');
        var dirPanel = document.getElementById('directory-panel');
        mrec.style.marginTop = ((360 - 250) / 2) + "px";
        dirPanel.style.marginTop = "-1000px";
        // Update name of clip here if required
        var message = document.getElementById('mrec-message');
        message.innerHTML = 'Advertisement: Your clip is next';
        $("#videoRatingForm").hide();
    },
    hideMrec: function () {
        var mrec = document.getElementById('mrec-wrapper');
        var dirPanel = document.getElementById('directory-panel');
        mrec.style.marginTop = "-1000px";
        dirPanel.style.marginTop = 0;
        $("#videoRatingForm").show();
    }
};
*/
var movideoAds = (function () {
    // find a Companion Ad with matching width and height
    // returns Companion Ad if matches
    // returns null if no matches
    function findCompanionAd(companionAds, width, height) {
        for (var i in companionAds) {
            var companionAd = companionAds[i];
            if (companionAd.width == width && companionAd.height == height) {
                return companionAd;
            }
        }
        return null;
    }
    function createIFrameString(width, height, src) {
        var f = '<iframe '
            + 'height="' + height + '" '
            + 'width="' + width + '" '
            + 'src="' + src + '" '
            + 'scrolling="no" frameborder="0" vspace="0" marginwidth="0" marginheight="0" allowtransparency="yes"></iframe>'
        return f;
    }
    // 
    var generateedElementPrefix = "movideoAdsElement";
    var nextGeneratedId = 0;
    var defaultResourceHandlers = {
        // for html resources, replace the innerHTML with the resource. 
        // NOTE does not support <script> elements in the HTML resource.
        // 
        'html': function (companionAd, element) {
            // when the companion resource starts with http:// then treat it as the src for an iframe element
            var url = companionAd.resource;
            var timestamp = new Date().getTime();
            url = url.replace(/\{timestamp\}/g, timestamp);
            // determine if resource is a URL for an iframe or plain html
            var isUrlResource = /^http:\/\//;
            if (isUrlResource.test(url)) {
                element.innerHTML = createIFrameString(companionAd.width, companionAd.height, url);
            }
            else {
                element.innerHTML = url;
            }
        },
        // for iframe resources, simply change the IFrameElement.src to point to the new URL.
        // 
        'iframe': function (companionAd, element) {
            var url = companionAd.resource;
            var timestamp = new Date().getTime();
            url = url.replace(/\{timestamp\}/g, timestamp);
            element.innerHTML = createIFrameString(companionAd.width, companionAd.height, url);
        },
        // for static resources, create HTML to wrap the resource, and inject to DOM. 
        // 
        'static': function (companionAd, element) {
            // handle images resource by creating an <a> link with an <img />
            // matches creativeTypes such as: image/jpeg, image/gif
            // 
            if (companionAd.creativeType.indexOf('image') == 0) {
                var html
                    = '<a href="' + companionAd.clickThroughUrl + '" target="_blank">'
                    + '<img border="0" src="' + companionAd.resource
                    + '" width="' + companionAd.width
                    + '" height="' + companionAd.height
                    + '" />'
                    + '</a>';
                element.innerHTML = html;
            }
            // handles SWFs by embedding in the ad container
            //
            else if (companionAd.creativeType == 'application/x-shockwave-flash') {
                element.innerHTML = "";
                var generatedElementId = (generateedElementPrefix + (nextGeneratedId++));
                var adElement = document.createElement("div");
                adElement.id = generatedElementId;
                element.appendChild(adElement);
                // some ads use clickTAG, and some use clickTag so we pass in both. 
                //var params = { wmode: "transparent" };
                swfobject.embedSWF(companionAd.resource + '?clickTAG=' + companionAd.clickThroughUrl + "&clickTag=" + companionAd.clickThroughUrl, generatedElementId, companionAd.width, companionAd.height, '9.0.0'); //, "flash/expressInstall.swf", false, params, nul);
            }
        }
    };
    return {
        /* ---------------------------------------------------------------- */
        /* legacy call back functions 
        /* ---------------------------------------------------------------- */
        advertChangedCallback: function (advertData) {
            movideoAds.updateAds(advertData);
        },
        controlsEnabledCallback: function (showing) {
            if (showing) {
                movideoAds.hideMrec();
            }
            else {
                movideoAds.showMrec();
            }
        },
        showMrec: function () {
            var mrec = document.getElementById('mrec-wrapper');
            var dirWrapper = document.getElementById('directory-wrapper');
            var dirPanel = document.getElementById('directory-panel');
            mrec.style.marginTop = ((360 - 250) / 2) + "px";
            dirPanel.style.marginTop = "-1000px";
            // Update name of clip here if required
            var message = document.getElementById('mrec-message');
            message.innerHTML = 'Advertisement: Your clip will start shortly';
            $("#videoRatingForm").hide();
        },
        hideMrec: function () {
            var mrec = document.getElementById('mrec-wrapper');
            var dirPanel = document.getElementById('directory-panel');
            mrec.style.marginTop = "-1000px";
            dirPanel.style.marginTop = 0;
            $("#videoRatingForm").show();
        },
        /* ---------------------------------------------------------------- */
        adSlots: [],
        adResourceHandlers: defaultResourceHandlers,
        updateAds: function (advertData) {
            for (var i in movideoAds.adSlots) {
                var adSlot = movideoAds.adSlots[i];
                if (adSlot) {
                    var adElement = document.getElementById(adSlot.id);
                    if (adElement) {
                        var companionAd = findCompanionAd(advertData.companionAds, adSlot.width, adSlot.height);
                        if (companionAd) {
                            var resourceHandler = movideoAds.adResourceHandlers[companionAd.resourceType];
                            if (resourceHandler) {
                                resourceHandler(companionAd, adElement);
                            }
                        }
                    }
                    if (adSlot.onChanged != null) {
                        adSlot.onChanged();
                    }
                }
            }
        },
        findCompanionAd: function (companionAds, width, height) {
            return findCompanionAd(companionAds, width, height);
        }
    }
})();
movideoAds.adSlots = [
    { id: 'leave-behind-wrapper', width: 468, height: 60 },
    { id: 'mrec', width: 300, height: 250 }
];

/* ---------------------------------------------------------------------------------------- */
/* PLAYLIST SCROLLER
/* ---------------------------------------------------------------------------------------- */
jQuery.fn.playlistScroller = function (options) {
    var content = this;
    // default settings
    var defaults = {
        btnNext: content.parent().parent().find('.right'),
        btnPrev: content.parent().parent().find('.left'),
        imageSize: '280x158'
    }
    // get settings passed to the function
    var o = $.extend(defaults, options);
    var ul = $('<ul class="scroll-list"></ul>');
    content.html('').append(ul);
    var playlists = '';
    for (i = 0; i < o.playlists.length; i++) {
        playlists += (playlists != '') ? ',' : '';
        playlists += o.playlists[i].playlistid;
    }
    var query = 'playlist/' + playlists + '?includeMedia=true&mediaLimit=1'
    content.videos({
        query: query,
        imageSize: o.imageSize,
        showduration: false,
        showdescription: true,
        headerCharLimit: 60,
        descriptionCharLimit: 100,
        onload: function () {
            var visibleItems = 4;
            o.btnPrev.fadeTo(0, 0.2);
            if (o.playlists.length < visibleItems) {
                o.btnNext.fadeTo(0, 0.2);
            }
            // reorder items in the order they were specified
            for (i = o.playlists.length - 1; i >= 0; i--) {
                for (x = 0; x < content.find('.item').length; x++) {
                    var item = $(content.find('.item')[x]);
                    var playlistid = item.attr('playlistid');
                    if (playlistid == o.playlists[i].playlistid) {
                        content.find('.video-panel').prepend(item);
                    }
                }
            }
            content.jCarouselLite({
                visible: visibleItems,
                scroll: 1,
                speed: 500,
                circular: false,
                btnNext: o.btnNext,
                btnPrev: o.btnPrev,
                afterEnd: function (obj) {
                    var index = obj.index();
                    var lastIndex = obj.siblings().length - visibleItems;
                    (index < lastIndex) ? o.btnNext.fadeTo(0, 1) : o.btnNext.fadeTo(0, 0.2);
                    (index == 0) ? o.btnPrev.fadeTo(0, 0.2) : o.btnPrev.fadeTo(0, 1);
                }
            });
            // do onload function if one is specified
            if (o.onload != undefined)
                o.onload();
        }
    });
};
/* ---------------------------------------------------------------------------------------- */
/* VIDEO
/* ---------------------------------------------------------------------------------------- */
jQuery.fn.inlineVideo = function (options) {
    var content = this;
    content.html('<div class="loading"></div>');
    // default settings
    var defaults = {
        mediaid: 0,
        imageSize: '300x169'
    }
    // get settings passed to the function
    var o = $.extend(defaults, options);
    content.videos({
        query: o.query,
        imageSize: o.imageSize,
        onload: function () {
            var mediaid = content.find('.item0').attr('mediaid');
            content.find('ul').addClass('inline-video');
            content.find('ul').before('<div class="video-player-container"><div class="player"></div></div>');
            content.find('a').click(function (e) {
                
                e.preventDefault();
                content.find('.video-player-container').show();
                content.find('.player').player({
                    apiKey: videoSettings.apiKey,
                    flashAppAlias: videoSettings.appName,
                    iosAppAlias: videoSettings.ipadAppName,
                    mediaId: mediaid,
                    autoPlay: true
                });
                $(this).blur();
                return false;
            });
        }
    });

    var content = this;
    content.html('<div class="loading"></div>');
    // default settings
    var defaults = {
        mediaid: 0
    }
    // get settings passed to the function
    var o = $.extend(defaults, options);
    var params = [];
    params[params.length] = { name: 'omitFields', value: 'ratio,creator,tagProfileId,mediaFileExists,syndicated,mediaSchedules,displayStatus,syndicatedPartners,encodingProfiles,tags,client,filename,status,defaultImage' };
    MOVIDEO.media.getMedia({
        id: o.mediaid,
        omit: false,
        params: params,
        async: true,
        errorHandler: function () { alert('error'); },
        handler: function (response) {
            // get title/image/id from xml
            var mediaid = response.id;
            var title = response.title;
            var description = response.description;
            var image = response.imagePath + 'cropped/280x158.png';
            var link = videoUrl + '?movideo_m=' + mediaid;
            // create list item
            var div = $(
    '<div class="video-small">' +
    '<div class="player"><div></div></div>' +
    '<a class="image">' +
    '<img border="0" width="145" height="81" />' +
    '<div class="play-icon"></div>' +
    '</a>' +
    '<div class="text">' +
    '<h4><a></a></h4>' +
    '<p></p>' +
    '<div>' +
    '</div>');
            // append data to list item
            li.find('img').error(function () {
                $(this).attr('src', defaultVideoThumb);
                $(this).addClass('video-missing-thumbnail');
            });
            div.find('a').attr('href', link);
            div.find('a').attr('title', title);
            div.find('h4 a').append(title);
            div.find('img').attr('src', image);
            div.find('p').append(description);
            // generate random id for the mo-video player
            var playerid = 'player_' + Math.floor(Math.random() * 10000001);
            div.find('.player DIV').attr('id', playerid);
            eval('var ' + playerid + ';');
            var player = eval('var ' + playerid);
            // when play icon is clicked, play video in mo-video player with random id
            div.find('a').click(function () {
                $(this).parent('.video-small').find('.player').show();
                if (player == undefined) {
                    player = movideoplayer.embedPlayer(playerid, appName, apiKey, '300', '169', { mediaId: mediaid, autoPlay: false });
                }
                else {
                    var currentMediaID = '';
                    var queue = player.getQueue();
                    if (queue.length > 0)
                        currentMediaID = queue[0].id;
                    if (currentMediaID == mediaid)
                        player.resume();
                    else
                        player.playMedia(mediaid);
                }
                $(this).blur();
                return false;
            });
            content.html(div);
            content.find('.text h4 a').textTruncate({ tail: '..' });
            content.find('.text P').textTruncate({ tail: '..' });
        }
    });
};

/* ---------------------------------------------------------------------------------------- */
/* VIDEO TABS
/* ---------------------------------------------------------------------------------------- */
jQuery.fn.videoTabs = function (options) {
    var content = this;
    // default settings
    var defaults = {
        maxvideos: 0,
        showdate: false,
        showdescription: false,
        showrating: false,
        showduration: true,
        prepend: false,
        imageSize: '96x72',
        videoPageUrl: videoSettings.videoPageURL
    }
    // get settings passed to the function
    var o = $.extend(defaults, options);
    var tabs = $('<ul class="tabs"></ul>');
    for (i = 0; i < o.videos.length; i++) {
        // Generate tab
        var title = o.videos[i].title;
        var query = o.videos[i].query;
        var maxvideos = (o.videos[i].maxvideos != undefined) ? o.videos[i].maxvideos : 0;
        var videopageurl = (o.videos[i].videoPageUrl != undefined && o.videos[i].videoPageUrl != '') ? o.videos[i].videoPageUrl : o.videoPageUrl;
        var item = $('<li><a><span></span></a></li>');
        item.find('SPAN').html(title);
        item.find('A').attr('query', query);
        item.find('A').attr('maxvideos', maxvideos);
        item.find('A').attr('videopageurl', videopageurl);
        tabs.append(item);
        // Generate tab content container
        var container = $('<div class="container"></div>');
        container.attr('title', escape(title));
        if (o.prepend)
            content.prepend(container);
        else
            content.append(container);
    }
    // put tab list in container
    if (tabs.find('LI').length > 1)
        content.prepend(tabs);
    //On Click Event
    tabs.find("A").click(function () {
        $(this).parent().siblings().find('.active').removeClass('active');
        $(this).addClass("active");
        var title = $(this).text();
        // find associated tab container
        var activeTab = content.find("div[title='" + escape(title) + "']");
        // check if tab content is empty
        if (activeTab.is(':empty')) {
            // show loading gif
            activeTab.append('<div class="loading"></div>').show();
            // get the url for the list of videos
            var query = $(this).attr('query');
            var videopageurl = $(this).attr('videopageurl');
            activeTab.videos({
                imageSize: o.imageSize,
                maxvideos: maxvideos,
                query: query,
                showduration: false,
                showdescription: true,
                headerCharLimit: 45,
                descriptionCharLimit: 55,
                videoPageUrl: videopageurl
            });
            // show div
            content.find('.container').hide();
            activeTab.fadeIn();
        }
        // else if tab has already been loaded
        else {
            // show div
            content.find('.container').hide();
            activeTab.fadeIn();
        }
        return false;
    });

    // default action: first tab visible, all other tabs hidden
    content.find('.container').hide();
    tabs.find("LI:first A").click();
};

/* ---------------------------------------------------------------------------------------- */
/* MUSIC CHART WIDGET
/* ---------------------------------------------------------------------------------------- */
jQuery.fn.chartWidget = function (options) {
    var defaults = {
        videoplaylistid: 0,
        audioplaylistid: 0,
        channelid: 0,
        maxitems: 5,
        videoPageUrl: videoSettings.videoPageURL
    };
    var chart = this;
    var constructorInputs = $.extend(defaults, options);
    // omit unnecessary fields for performance
    var params = [{ name: 'omitFields', value: "description,copyright,ratio,creator,client,tagProfileId,imageFilename,meiaFileExists,creationDate,syndicated,mediaFileExists,tagProfile,podcastSupported,syndicatedPartners,lastModifiedDate,mediaSchedules,displayStatus,syndicatedPartners,encodingProfiles,defaultImage,filename,status,cuePointsExist"}];
    if (constructorInputs.channelid > 0) {
        MOVIDEO.media.getChannel({
            id: constructorInputs.channelid,
            media: true,
            omit: true,
            params: params,
            handler: function (json) {
                handlePlaylists(json.playlists);
            }
        });
    }
    if (constructorInputs.videoplaylistid > 0 || constructorInputs.audioplaylistid > 0) {
        MOVIDEO.media.getPlaylist({
            id: constructorInputs.videoplaylistid + "," + constructorInputs.audioplaylistid,
            media: true,
            omit: false,
            params: params,
            handler: handlePlaylists
        });
    }
    function handlePlaylists(json) {
        var videoArray = new Array();
        var audioArray = new Array();
        var videoPlaylistId = 0;
        var audioPlaylistId = 0;
        // the longest playlist
        var masterPlaylist;
        var playlists = findJSONobjects(json, "playlist");
        $.each(playlists, function (index, playlist) {
            if (playlist.id == constructorInputs.videoplaylistid) {
                videoPlaylistId = playlist.id;
                videoArray = findJSONobjects(playlists[0], "media");
            }
            if (playlist.id == constructorInputs.audioplaylistid) {
                audioPlaylistId = playlist.id;
                audioArray = findJSONobjects(playlists[0], "media");
            }
        });
        buildChart(videoPlaylistId, videoArray, audioPlaylistId, audioArray);
    }
    function buildChart(videoPlaylistId, videoArray, audioPlaylistId, audioArray) {
        var masterPlaylist;
        if (videoArray.length > audioArray.length) {
            masterPlaylist = videoArray;
        } else {
            masterPlaylist = audioArray;
        }
        var chartlist = chart.append('<table cellspacing="0" cellpadding="0" summary="ARIA Charts"><tbody></tbody></table>').find('tbody');
        var videoTitleArray = createMediaTitleMap(videoArray);
        var audioTitleArray = createMediaTitleMap(audioArray);
        var i;
        for (i = 0; i < masterPlaylist.length && i < constructorInputs.maxitems; i++) {
            var row = createRowObject(i + 1, videoTitleArray[masterPlaylist[i].title], audioTitleArray[masterPlaylist[i].title], videoPlaylistId, audioPlaylistId);
            chartlist.append(addRow(row, i + 1));
        }
        chart.find('.song a, .artist span').textTruncate({ tail: '..' });
    }
    function createMediaTitleMap(mediaArray) {
        var titleMap = {};
        var i = null;
        for (i = 0; mediaArray.length > i; i += 1) {
            titleMap[mediaArray[i].title] = mediaArray[i];
        }
        return titleMap;
    }
    function searchTag(ns, predicate, tags) {
        if (tags == undefined) {
            return null;
        }
        else {
            for (var i = 0; i < tags.length; i++) {
                if (tags[i].ns == ns && tags[i].predicate == predicate) {
                    return tags[i].value;
                }
            }
            return null;
        }
    }
    function isArray(obj) {
        if (obj.constructor.toString().indexOf("Array") == -1)
            return false;
        else
            return true;
    }
    function createRowObject(pos, video, audio, videoPlaylistId, audioPlaylistId) {
        var media;
        var row = new Object();
        row.pos = pos;
        row.audioId = 0;
        row.videoId = 0;
        row.audioPlaylistId = audioPlaylistId;
        row.videoPlaylistId = videoPlaylistId;
        if (audio != null) {
            media = audio;
            row.audioId = audio.id;
            if (constructorInputs.useVideoImage === false) {
                if (pos == 1) {
                    row.image = audio.imagePath + constructorInputs.dimensionA + ".png";
                } else {
                    row.image = audio.imagePath + constructorInputs.dimensionB + ".png";
                }
            }
        }
        if (video != null) {
            media = video;
            row.videoId = video.id;
            if (constructorInputs.useVideoImage === true) {
                if (pos == 1) {
                    row.image = video.imagePath + constructorInputs.dimensionA + ".png";
                } else {
                    row.image = video.imagePath + constructorInputs.dimensionB + ".png";
                }
            }
        }
        row.artist = searchTag("music", "artist", findJSONobjects(media, "tag"));
        row.title = media.title;
        if (row.image == null) {
            if (pos == 1) {
                row.image = constructorInputs.imageDefaultA;
            } else {
                row.image = constructorInputs.imageDefaultB;
            }
        }
        return row;
    }
    function addRow(row) {
        var chartRowTemplate = $('<tr>' +
                '<th class="number"></th>' +
                '<td class="song"><a></a></td>' +
                '<td class="artist"><span></span></td>' +
                '<td><a class="btnWatch"></a></td>' +
            '</tr>');
        chartRowTemplate.addClass('row' + row.pos);
        chartRowTemplate.find(".number").text(row.pos);
        chartRowTemplate.find(".song a").text(row.title);
        chartRowTemplate.find(".artist span").text(row.artist);
        chartRowTemplate.find('a').attr('href', constructorInputs.videoPageUrl + '?' + videoSettings.playlistParam + '=' + row.videoPlaylistId + '&' + videoSettings.mediaParam + '=' + (row.videoId > 0 ? row.videoId : row.audioId));
        return chartRowTemplate;
    }
};

/* ---------------------------------------------------------------------------------------- */
/* LARGE MUSIC CHART
/* ---------------------------------------------------------------------------------------- */
jQuery.fn.chart = function (options) {
    var defaults = {
        videoplaylistid: 0,
        audioplaylistid: 0,
        channelid: 0,
        dimensionA: "90x90",
        dimensionB: "72x72",
        imageDefaultA: "/images/css/default_video_thumb.png",
        imageDefaultB: "/images/css/default_video_thumb.png",
        handleClickArtist: null,
        handleClickPosition: null,
        handleClickImage: null,
        handleClickTitle: null,
        handleClickVideo: null,
        handleClickAudio: null,
        handleClickDownload: null,
        desc: false,
        useVideoImage: true
    };
    var chart = this;
    chart.addClass("chart-widget");
    var constructorInputs = $.extend(defaults, options);
    // omit unnecessary fields for performance
    var params = [{ name: 'omitFields', value: "description,copyright,ratio,creator,client,tagProfileId,imageFilename,meiaFileExists,creationDate,syndicated,mediaFileExists,tagProfile,podcastSupported,syndicatedPartners,lastModifiedDate,mediaSchedules,displayStatus,syndicatedPartners,encodingProfiles,defaultImage,filename,status,cuePointsExist" }, { name: 'mediaLimit', value: '11'}];
    if (constructorInputs.channelid > 0) {
        MOVIDEO.media.getChannel({
            id: constructorInputs.channelid,
            media: true,
            omit: true,
            params: params,
            handler: handleChannel
        });
    }
    if (constructorInputs.videoplaylistid > 0 || constructorInputs.audioplaylistid > 0) {
        MOVIDEO.media.getPlaylist({
            id: constructorInputs.videoplaylistid + "," + constructorInputs.audioplaylistid,
            media: true,
            omit: false,
            params: params,
            handler: handlePlaylists
        });
    }
    function handleChannel(json) {
        handlePlaylists(json.playlists);
    }
    function handlePlaylists(json) {
        var videoArray = new Array();
        var audioArray = new Array();
        var videoPlaylistId = 0;
        var audioPlaylistId = 0;
        // the longest playlist
        var masterPlaylist;
        
        var playlists = findJSONobjects(json, "playlist");
        $.each(playlists, function (index, playlist) {
            if (playlist.id == constructorInputs.videoplaylistid) {
                videoPlaylistId = playlist.id;
                videoArray = findJSONobjects(playlists[0], "media");
            }
            if (playlist.id == constructorInputs.audioplaylistid) {
                audioPlaylistId = playlist.id;
                audioArray = findJSONobjects(playlists[0], "media");
            }
        });
        buildChart(videoPlaylistId, videoArray, audioPlaylistId, audioArray);
    }
    function buildChart(videoPlaylistId, videoArray, audioPlaylistId, audioArray) {
        var masterPlaylist;
        if (videoArray.length > audioArray.length) {
            masterPlaylist = videoArray;
        } else {
            masterPlaylist = audioArray;
        }
        var chartlist = chart.html('<ul></ul>').find('ul');
        chartlist.attr("id", "chart-list");
        chartlist.attr('class', 'chart-list');
        var videoTitleArray = createMediaTitleMap(videoArray);
        var audioTitleArray = createMediaTitleMap(audioArray);
        var i;
        if (constructorInputs.desc === false) {
            for (i = 0; i < masterPlaylist.length; i++) {
                var row = createRowObject(i + 1, videoTitleArray[masterPlaylist[i].title], audioTitleArray[masterPlaylist[i].title], videoPlaylistId, audioPlaylistId);
                chartlist.append(addRow(row));
            }
        } else {
            for (i = masterPlaylist.length - 1; i >= 0; i--) {
                var row = createRowObject(i + 1, videoTitleArray[masterPlaylist[i].title], audioTitleArray[masterPlaylist[i].title], videoPlaylistId, audioPlaylistId);
                chartlist.append(addRow(row));
            }
        }
        chart.find('img').error(function () {
            $(this).attr('src', constructorInputs.imageDefaultB);
        });
        chartInit();
    }
    function chartInit() {
        var rows = chart.find('.chart-row');
        // add 'first' class to first list item
        $(rows[0]).addClass('first');
        rows.each(function (index) {
            $(this).addClass('item' + (index + 1));
        });
        // pagination
        var items_per_page = 20;
        // first, check if items > page limit
        if (rows.length > items_per_page) {
            // Create pagination element
            var pagination = $('<div class="chart-pagination"><p>Showing 1-20 of Top 40 Singles</p><div class="links"></div></div>');
            chart.after(pagination);
            pagination.find('.links').pagination(rows.length, {
                items_per_page: items_per_page,
                callback: function (page_id, jq) {
                    var top = 0;
                    if (rows.length < ((page_id * items_per_page) + items_per_page)) {
                        top = rows.length;
                    } else {
                        top = (page_id * items_per_page) + items_per_page;
                    }
                    pagination.find('p').remove();
                    pagination.prepend("<p>Showing " + ((page_id * items_per_page) + 1) + "-" + top + " of Top 40 Singles</p>");
                    var count = 0;
                    rows.each(function () {
                        count++;
                        if ((count < (page_id * items_per_page) + 1) || (count > (page_id * items_per_page) + items_per_page)) {
                            $(this).hide();
                        } else {
                            $(this).show();
                        }
                    });
                    pagination.find('.links').find('a, span').each(function () {
                        if (!isNaN($(this).text())) {
                            var pagenumber = parseInt($(this).text());
                            var startitem = ((pagenumber - 1) * items_per_page) + 1;
                            var enditem = items_per_page * pagenumber;
                            enditem = (enditem > rows.length) ? rows.length : enditem;
                            $(this).html(startitem + ' - ' + enditem);
                        }
                        else {
                            if ($(this).text() == 'Prev') $(this).html('&lt;&nbsp;Prev');
                            if ($(this).text() == 'Next') $(this).html('Next&nbsp;&gt;');
                        }
                    });
                }
            });
            var count = 0;
            rows.each(function () {
                count++;
                if ((count < 1) || (count > items_per_page)) {
                    $(this).hide();
                } else {
                    $(this).show();
                }
            });
        }
    }
    function createMediaTitleMap(mediaArray) {
        var titleMap = {};
        var i = null;
        for (i = 0; mediaArray.length > i; i += 1) {
            titleMap[mediaArray[i].title] = mediaArray[i];
        }
        return titleMap;
    }
    function searchTag(ns, predicate, tags) {
        for (var i = 0; i < tags.length; i++) {
            if (tags[i].ns == ns && tags[i].predicate == predicate) {
                return tags[i].value;
            }
        }
        return null;
    }
    function isArray(obj) {
        if (obj.constructor.toString().indexOf("Array") == -1)
            return false;
        else
            return true;
    }
    function createRowObject(pos, video, audio, videoPlaylistId, audioPlaylistId) {
        var media;
        var row = new Object();
        row.pos = pos;
        row.audioId = 0;
        row.videoId = 0;
        row.audioPlaylistId = audioPlaylistId;
        row.videoPlaylistId = videoPlaylistId;
        if (audio != null) {
            media = audio;
            row.audioId = audio.id;
            if (constructorInputs.useVideoImage === false) {
                if (pos == 1) {
                    row.image = audio.imagePath + constructorInputs.dimensionA + ".png";
                } else {
                    row.image = audio.imagePath + constructorInputs.dimensionB + ".png";
                }
            }
        }
        if (video != null) {
            media = video;
            row.videoId = video.id;
            if (constructorInputs.useVideoImage === true) {
                if (pos == 1) {
                    row.image = video.imagePath + constructorInputs.dimensionA + ".png";
                } else {
                    row.image = video.imagePath + constructorInputs.dimensionB + ".png";
                }
            }
        }
        row.artist = searchTag("music", "artist", findJSONobjects(media, "tag"));
        row.title = media.title;
        if (row.image == null) {
            if (pos == 1) {
                row.image = constructorInputs.imageDefaultA;
            } else {
                row.image = constructorInputs.imageDefaultB;
            }
        }
        return row;
    }
    function addRow(row) {
        var chartRowTemplate = $('<li class="chart-row">' +
                '<div class="chart-row-position"></div>' +
                '<div class="chart-row-details">' +
                    '<div><a class="chart-row-title"></a></div>' +
                    '<div><a class="chart-row-artist"></a></div>' +
                '</div>' +
                '<div class="chart-row-buttons">' +
                    '<ul>' +
                        '<li><a class="chart-row-play-video">Watch Video</a></li>' +
                        '<li><a class="chart-row-play-audio">Listen to Audio</a></li>' +
                        '<li><a class="chart-row-image"></a></li>' +
                        '<li><a class="chart-row-download">Download</a></li>' +
                    '</ul>' +
                '</div>' +
                '<div class="chart-row-divider"></div>' +
            '</li>');
        chartRowTemplate.find(".chart-row-position").text(row.pos);
        if (constructorInputs.handleClickPosition != null) {
            chartRowTemplate.find(".chart-row-position").click(function () {
                constructorInputs.handleClickPosition(row);
            });
        }
        chartRowTemplate.find(".chart-row-title").text(row.title);
        if (constructorInputs.handleClickTitle != null) {
            chartRowTemplate.find(".chart-row-title").click(function () {
                constructorInputs.handleClickTitle(row);
            });
        }
        chartRowTemplate.find(".chart-row-artist").text(row.artist);
        if (constructorInputs.handleClickArtist != null) {
            chartRowTemplate.find(".chart-row-artist").click(function () {
                constructorInputs.handleClickArtist(row);
            });
        }
        chartRowTemplate.find(".chart-row-image").html('<img src="' + row.image + '" alt="' + row.artist + ' - ' + row.title + '"/>');
        if (constructorInputs.handleClickArtist != null) {
            chartRowTemplate.find(".chart-row-image").click(function () {
                constructorInputs.handleClickImage(row);
            });
        }
        if (row.audioId == 0) {
            chartRowTemplate.find(".chart-row-play-audio").css('visibility', 'hidden'); //remove();
        } else if (constructorInputs.handleClickAudio != null) {
            chartRowTemplate.find(".chart-row-play-audio").click(function () {
                constructorInputs.handleClickAudio(row);
            });
        }
        if (row.videoId == 0) {
            chartRowTemplate.find(".chart-row-play-video").css('visibility', 'hidden'); //remove();
        } else if (constructorInputs.handleClickVideo != null) {
            chartRowTemplate.find(".chart-row-play-video").click(function () {
                constructorInputs.handleClickVideo(row);
            });
        }
        if (constructorInputs.handleClickDownload == null) {
            chartRowTemplate.find(".chart-row-download").css('visibility', 'hidden'); //remove();
        } else {
            chartRowTemplate.find(".chart-row-download").click(function () {
                constructorInputs.handleClickDownload(row);
            });
        }
        return chartRowTemplate;
    }
};

/* ---------------------------------------------------------------------------------------- */
/* LOAD VIDEO PAGE
/* - for iPad - Load Universal Player + Javascript Tree Control
/* - for PC - Load Legacy Player + Flash Tree Control
/* ---------------------------------------------------------------------------------------- */
var mediaPathGenerator;
var currentPlaylistID = '';
var device = MOVIDEO.utils.getDevice();
var iPad = (device.type == MOVIDEO.utils.deviceTypeEnum.iPad);
var iPhone = (device.type == MOVIDEO.utils.deviceTypeEnum.iPhone);
var iOS3 = device.agent.indexOf('CPU OS 3') > -1;
var legacy_video_player;
var videoAdCount = 0;
var tvc_name = '';
var tvc_campaign = '';
function loadVideoPage(options) {
    var defaults = {
        apiKey: videoSettings.apiKey,
        appName: videoSettings.appName,
        universalFlashAppName: videoSettings.flashAppName,
        universalIOSAppName: videoSettings.ipadAppName,
        defaultPlaylistId: '',
        assetFolder: 'playerassets',
        posterURL: '',
        posterDisabled: false,
        universal: false,
        flash: true,
        showRelated: false,
        searchTagValue: '',
        overrideRootLabel: false,
        emTracking: false,
        relatedTags: '',
        iphone: false
    }
    var o = $.extend(defaults, options);
    if (o.flashTreeViewUrl == undefined) { o.flashTreeViewUrl = o.assetFolder + '/video_directory.swf'; }
    if (o.flashRelatedPanelUrl == undefined) { o.flashRelatedPanelUrl = o.assetFolder + '/movideo_searchpanel.swf'; }
    var player;
    var universal = iPad || o.universal || (location.href.indexOf('universal=true') > -1);
    var flash = o.flash && (location.href.indexOf('flash=false') < 0);
    movideoAds.adSlots = [
        { id: 'leave-behind-wrapper', width: 468, height: 60 },
        { id: 'mrec', width: 300, height: 250 }
    ];
    $("#videoRatingForm").css('visibility', 'hidden'); //.hide();
    var currentPlayingPlaylistId = '';
    var videoParams = getVideoParams();
    function getKitPlaylistId() {
        var url = window.location.href;
        var kit = (((url.indexOf("clipid") > -1) && (url.indexOf("channel") > -1)) || ((url.indexOf("ClipId") > -1) && (url.indexOf("vxChannel") > -1)));
        
        if (kit) {
            var params = {
                channel: null,
                playlistid: null
            }
            if ((url.indexOf("clipid") > -1) && (url.indexOf("channel") > -1)) {
                params.channel = $.trim(MOVIDEO.utils.getQueryStringParameter('channel'));
            }
            else if ((url.indexOf("ClipId") > -1) && (url.indexOf("vxChannel") > -1)) {
                params.channel = $.trim(MOVIDEO.utils.getQueryStringParameter('vxChannel'));
            }
            if (params.channel != null) {
                params.channel = encodeURI(params.channel);
                params.channel = params.channel.replace('_', '%5F');
                var input = $("input[kit='" + params.channel + "']");
                if (input.length > 0) {
                    params.playlistid = input.attr("mplaylistId");
                }
            }
         
            if (params.playlistid != null) {
                return params.playlistid;
            }
            else {
                return null;
            }
        }
        else {
            return null;
        }
    }
    function showVideoAds() {
        var mrec = document.getElementById('mrec-wrapper');
        var dirWrapper = document.getElementById('directory-wrapper');
        var dirPanel = document.getElementById('directory-panel');
        mrec.style.marginTop = ((360 - 250) / 2) + "px";
        dirPanel.style.marginTop = "-1000px";
        // Update name of clip here if required
        var message = document.getElementById('mrec-message');
        message.innerHTML = 'Advertisement: Your clip will start shortly';
        $("#videoRatingForm").css('visibility', 'hidden'); //.hide();
        $('.directory-ipad-info').hide();
    }
    function hideVideoAds() {
        var mrec = document.getElementById('mrec-wrapper');
        var dirPanel = document.getElementById('directory-panel');
        mrec.style.marginTop = "-1000px";
        dirPanel.style.marginTop = 0;
        $("#videoRatingForm").css('visibility', 'visible'); //.show();
        $('.directory-ipad-info').show();
    }   

    function getVideoParams() {
        var params = {
            mediaid: null,
            playlistid: null
        };
        if (window.location.href.indexOf(videoSettings.playlistParam) > -1 || window.location.href.indexOf(videoSettings.mediaParam) > -1) {
            var query = window.location.search.substring(1);
            var vars = query.split("&");
            for (var i = 0; i < vars.length; i++) {
                var pair = vars[i].split("=");
                if (pair[0] == videoSettings.playlistParam) {
                    params.playlistid = pair[1];
                }
                if (pair[0] == videoSettings.mediaParam) {
                    params.mediaid = pair[1];
                }
            }
        }
        var kitPlaylistId = getKitPlaylistId();
        if (kitPlaylistId != null) {
            if (params.playlistid == null) {
                params.playlistid = kitPlaylistId;
            }
        }
        return params;
    }
    function loadStarRatings(mediaid) {
        // Star ratings
        var starRate = starRating.setup(6, 1, mediaid);
        starRate.drawForm(mediaid, $("#mediaRating"), { voteDisabled: false });
        $("#mediaRating .stars").bind("click", function () {
            rate = $("#mediaRating input").val().split(',')[3];
            $("#s_ph" + mediaid + " .stars").stars("select", rate);
            
            countStr = $("#mediaRating span").html()
            $("#s_ph" + mediaid + " span").html(countStr);
        });
        $("#videoRatingForm").css('visibility', 'visible'); //.show();
    }
    function trackVideoPlay() {
        // call EM tracking when changing playlists
        if (o.emTracking) {
            var videoPlaylistId = (universal) ? $('#movideo-player').player('playlist').title : player.getCurrentPlaylist().title;
            if (videoPlaylistId != currentPlayingPlaylistId) {
                currentPlayingPlaylistId = videoPlaylistId;
                var emTrackingUrl = document.domain + "/videoclip/#playlist:" + videoPlaylistId;
                if (location.href.indexOf('debug=true') > -1) { console.log('emTracking: ' + emTrackingUrl); }
                _em.trackAjaxPageview(emTrackingUrl);
            }
        }
    }
    function showRelatedVideoPanel(mediaid) {
        var query = 'media';
        if (mediaid != undefined) {
            query = 'media/related/' + mediaid;
        }
        else {
            if (o.relatedTags != '') {
                query = 'media/search?operator=or&paged=false&pageSize=7&orderBy=creationDate&orderDesc=true';
            }
            else {
                query = 'media?paged=false&pageSize=7&orderBy=creationDate&orderDesc=true';
            }   
        }
        $('#related-wrapper').empty().videos({
            tags: o.relatedTags,
            query: query,
            params: params,
            maxvideos: 7,
            showduration: false,
            showdescription: true,
            onload: function () {
                $('#related-wrapper').prepend('<h3>Related Videos</h3>');
                $('#related-wrapper').find('a').click(function (e) {
                    e.preventDefault();
                    var li = $(this).parents('li.item')[0];
                    var mediaid = $(li).attr('mediaid');
                    playMedia(mediaid);
                });
            }
        });
    }
    function loadUniversalPlayer() {
        var settings = {
            apiKey: o.apiKey,
            flashAppAlias: o.universalFlashAppName,
            iosAppAlias: o.universalIOSAppName,
            posterURL: o.posterURL,
            posterDisabled: o.posterDisabled
        };
        if (iPad) {
            settings.adProxyPath = '/oascentral';
            settings.adURLPreProcesser = videoAnalytics.processOASAdvertisingURL;
            $("#directory-wrapper").append('<div class="directory-ipad-info"></div>');
            $('#directory-wrapper').addClass('ipad');
            if (!iOS3) {
                $('HEAD').append('<style type="text/css">.movideo-ui-tree-list { -webkit-transform:translate3d(0,0,0); }</style>');
            }
        }
        $('#movideo-player').player(settings);
        if (iPad) {
            $("#movideo-player").bind("playeranalytics", videoAnalytics.handleOmnitureTracking);
        }
        var playerLoaded = false;
        $("#movideo-player").bind("playeridle", function (event, data) {
            if (location.href.indexOf('debug=true') > -1) { console.log('playerIdle'); }
            if (!playerLoaded) {
                playerLoaded = true;
                var obj = new Object();
                if (videoParams.mediaid != undefined) { obj.mediaId = videoParams.mediaid; }
                if (videoParams.playlistid != undefined) { obj.playlistId = videoParams.playlistid; }
                if (obj.mediaId != undefined || obj.playlistId != undefined) {
                    playMedia(obj.mediaId, obj.playlistId); // $('#movideo-player').player('play', obj);
                }
            }
        });
        $("#movideo-player").bind("playerad", function (event, data) {
            if (location.href.indexOf('debug=true') > -1) { console.log('playerAd'); }
            try {
                var startIndex = data.impressionURLs[0].indexOf('/x81/NetTen/') + '/x81/NetTen/'.length;
                var endIndex = data.impressionURLs[0].indexOf('/', startIndex);
                tvc_campaign = data.impressionURLs[0].substring(startIndex, endIndex);
            }
            catch (e) { }
            try {
                var path = data.mediaFiles[0].path;
                path = path.substring(path.lastIndexOf('/') + 1);
                tvc_name = path;
            }
            catch (e) { }
            videoAdCount++;
            movideoAds.updateAds(data);
            showVideoAds();
        });
        $("#movideo-player").bind("playerprogress", function (event, data) {
            //if (location.href.indexOf('debug=true') > -1) { console.log('playerProgress : advertisement = ' + $('#movideo-player').player('isAdvert')); }
            /*
            var adPlaying = $('#movideo-player').player('isAdvert');
            if (adPlaying) {
                showVideoAds();
            }
            else {
                hideVideoAds();
            }
            */
        });
        $("#movideo-player").bind("playerplay", function (event, data) {
            if (location.href.indexOf('debug=true') > -1) { console.log('playerPlay : advertisement = ' + $('#movideo-player').player('isAdvert')); }
            var adPlaying = $('#movideo-player').player('isAdvert');
            if (!adPlaying) {
                videoAdCount = 0;
                hideVideoAds();
            }
            var mediaid = data.id;
            if (o.showRelated && !flash) {
                showRelatedVideoPanel(mediaid);
            }
            $('#directory-panel').tree('gotoMedia', mediaid);
            if ($("#mediaRating").length > 0) {
                loadStarRatings();
            }
            trackVideoPlay();
        });
        $("#movideo-player").bind("playerplaycomplete", function (event, data) {
            if (location.href.indexOf('debug=true') > -1) { console.log('playerPlayComplete : advertisement = ' + $('#movideo-player').player('isAdvert')); }
            //hideVideoAds();
        });        
    }
    if (!universal) {
        // load flash player + flash tree view using legacy code        
        player = movideoplayer.embedPlayer('movideo-player', o.appName, o.apiKey, 512, 288);
        player.setControlsEnabledCallback(function (showing) {
            if (showing) {
                hideVideoAds();
            }
            else {
                showVideoAds();
            }
        });
        player.setUpdateAdvertisementCallback(function (advertData) {
            if (o.emTracking) {
                trackVideoPlay();
            }
            movideoAds.updateAds(advertData);
        });
        player.setInitializeCallback(function () {
            if (videoParams.mediaid != undefined) {
                if (videoParams.playlistid != null) {
                    player.playPlaylistFromMediaId(videoParams.playlistid, videoParams.mediaid);
                }
                else {
                    player.playMedia(videoParams.mediaid);
                }
            }
            else if (videoParams.playlistid != null) {
                player.playPlaylist(videoParams.playlistid);
            }
        });

        player.setMediaChangedCallback(function (media) {
            if ($("#mediaRating").length > 0) {
                loadStarRatings();
            }
            trackVideoPlay(player);
        });
        legacy_video_player = player;
    }
    else {
        // load universal player + javacsript tree view
        $('#vxFlashPlayerFailure').remove();
        if (!iPhone || o.iphone) {
            if (iPad) {
                var params = getVideoParams();
                mediaPathGenerator = videoAnalytics.MediaPathGenerator(params.mediaid, params.playlistid, function () {
                    loadUniversalPlayer();
                });
            }
            else {
                loadUniversalPlayer();
            }
        }
    }

    /* ---------------------------------------------------------------------------------------- */
    /* TREE VIEW
    /* ---------------------------------------------------------------------------------------- */
    var playerId = '';
    if (!universal) { playerId = player.playerId; }
    else { playerId = $('#movideo-player').player("playerId"); }

    if (flash && !iPad) {
        var flashVars = "config=./" + o.assetFolder + "/";
        flashVars += "&playerId=" + playerId;
        flashVars += "&playlistId=" + o.defaultPlaylistId;
        flashVars += "&applicationAlias=" + o.appName;
        flashVars += "&apiKey=" + o.apiKey;
        if (o.overrideRootLabel) { flashVars += '&overrideRootLabel=true'; }
        flashVars += "&searchTagValue=" + escape(o.searchTagValue);
        var params = {
            flashVars: flashVars,
            menu: "false",
            allowScriptAccess: "always",
            allowFullScreen: "true",
            wmode: "transparent",
            quality: "high"
        };
        swfobject.embedSWF(o.flashTreeViewUrl, "directory-panel", '100%', '100%', "9.0.0", "flash/expressinstall.swf", false, params, null);        
    }
    else {
        //$('#movideo-player').player("play", { playlistId: o.defaultPlaylistId });
        var appAlias = (iPad) ? o.universalIOSAppName : o.universalFlashAppName;
        //animationSpeed:0
        $('#directory-panel').tree({
            appAlias: appAlias,
            apiKey: o.apiKey,
            playlist: o.defaultPlaylistId,
            searchTags: o.searchTagValue,
            showBreadcrumbs: true,
            titlePipeIndex: (o.overrideRootLabel) ? 0 : 1,
            includeEmptyPlaylists: false
        });
        $('#directory-panel').bind("treeplaylist", function (event, data) { currentPlaylistID = data.id; });
        $('#directory-panel').bind("treemedia", function (event, data) {
            if (location.href.indexOf('debug=true') > -1) {
                var mediaPath = '';
                var activePlaylist = $('#directory-panel').tree('getActivePlaylist');
                mediaPath += getTagValue(activePlaylist, 'playlist:code');
                var activeMedia = $('#directory-panel').tree('getActiveMedia');
                mediaPath += '/' + getTagValue(activeMedia, 'clip:code');
                console.log('MEDIA-PATH FROM TREE = ' + mediaPath);
            }
            playMedia(data.id, currentPlaylistID); //$("#movideo-player").player("play", { mediaId: data.id, playlistId: currentPlaylistID }); 
        });
        // click event on the tab to hide search results
        $(document).ready(function () {
            $('.movideo-ui-tree-title.movideo-ui-tree-ui').css('cursor', 'pointer');
            $('.movideo-ui-tree-title.movideo-ui-tree-ui').click(function () {
                if ($('.movideo-ui-tree-search-close a').length > 0) {
                    $('.movideo-ui-tree-search-close a').click();
                }
            });
        });
    }
    /* ---------------------------------------------------------------------------------------- */
    /* RELATED PANEL
    /* ---------------------------------------------------------------------------------------- */
    if (o.showRelated) {
        if (flash && !iPad) {
            var flashVars = "config=./" + o.assetFolder + "/searchpanel/";
            flashVars += "&playerId=" + playerId;
            flashVars += "&playlistId=" + o.defaultPlaylistId;
            flashVars += "&applicationAlias=" + o.appName;
            flashVars += "&apiKey=" + o.apiKey;
            var relatedParams = {
                flashVars: flashVars,
                menu: "false",
                allowScriptAccess: "always",
                allowFullScreen: "true",
                wmode: "transparent",
                quality: "high"
            };
            swfobject.embedSWF(o.flashRelatedPanelUrl, "related-panel", '100%', '100%', "9.0.0", "flash/expressinstall.swf", false, relatedParams, null);
        }
        else {
            showRelatedVideoPanel();
        }
    }
}
function getTagValue(obj, tagName) {
    var ns = tagName.split(':')[0];
    var predicate = tagName.split(':')[1];
    var tags = findJSONobjects(obj, 'tag');
    if (tags.length != undefined) {
        for (x = 0; x < tags.length; x++) {
            if ((typeof (tags[x])) == 'object') {
                if ((tags[x].ns == ns) && (tags[x].predicate == predicate)) {
                    return tags[x].value;
                }
            }
        }
    }
    return null;
}
function playMedia(mediaid, playlistid) {
    mediaid = !isNaN(mediaid) ? mediaid : null;
    playlistid = !isNaN(playlistid) ? playlistid : null;
    var obj = new Object();
    if (mediaid != null) { obj.mediaId = mediaid; }
    if (playlistid != null) { obj.playlistId = playlistid; }
    if (iPad) {
        mediaPathGenerator = new videoAnalytics.MediaPathGenerator(mediaid, playlistid, function () {
            $('#movideo-player').player('play', obj);
        });
    }
    else {
        $('#movideo-player').player('play', obj);
    }
}
var videoAnalytics = {
    /**
    * Process the URL passed in from the player's advertising config. 
    * If player is running on iOS3 then cancel advert request by returning null.
    */
    processOASAdvertisingURL: function (url) {
        // Replace the tokens in the OAS URL with our new values
        var data = {
            vastPlayer: videoSettings.vastPlayer,
            vastSite: videoSettings.vastSite,
            timestamp: +(new Date())
        };
        data[videoSettings.vastReplaceToken] = mediaPathGenerator.getOASMediaPath($('#movideo-player').player("media"));
        data["javascript:get_device_path"] = get_device_path();
        data["javascript:get_tvc_name"] = get_tvc_campaign();
        data["javascript:get_tvc_campaign"] = get_tvc_campaign();
        data["javascript:get_player_ad_count"] = get_player_ad_count();
        if (location.href.indexOf('debug=true') > -1) { console.log('AD URL = ' + MOVIDEO.utils.replaceTokens(url, data)); }
        return MOVIDEO.utils.replaceTokens(url, data);
    },
    /**
    * Handle player analytics events and convert them to Omniture tracking requests
    */
    handleOmnitureTracking: function (event, data) {
        var type = data.type;
        if (type == undefined) {
            type = data.mediaType;
        }
        // Only record if this is a play event, the type is video (i.e. not 'AD')
        if (data.event == "Play" && type.toUpperCase() == "VIDEO") {
            var media = $('#movideo-player').player("media");
            var playlist = $('#movideo-player').player("playlist");
            var omNS = videoSettings.omnitureAccount;
            var path = (function (media, playlist) {
                // Prefer playlist title if available
                if (playlist && playlist.title) {
                    return playlist.title;
                } else {
                    // else if vastMediaTag exists, use it
                    var tc = (videoSettings.vastMediaTag || "").split(":");
                    if (tc.length == 2) {
                        return MOVIDEO.utils.getTagValue(media.tags, tc[0], tc[1]);
                    }
                }
                // else set no playlist title
                return "";
            })(media, playlist);
            var currentTime = new Date();
            var month = currentTime.getMonth();
            var day = currentTime.getDate();
            var year = currentTime.getFullYear();
            var hours = currentTime.getHours();
            var minutes = currentTime.getMinutes();
            var seconds = currentTime.getSeconds();
            var timeEnc = encodeURI(day + "/" + month + "/" + year + " " + hours + ":" + minutes + ":" + seconds + " " + currentTime.getDay() + " " + currentTime.getTimezoneOffset());
            var titleEnc = encodeURI(media.title);
            var appEnc = encodeURI(MOVIDEO.utils.getApplicationAlias());
            var pathEnc = encodeURI(path);
            var pageUrl = escape(document.location.toString());
            var url = "http://metrics.ten.com.au/b/ss/" + videoSettings.omnitureAccount + "," + videoSettings.omnitureGlobalSuite + "/0/FAS-3.1.2-AS3/s75817903643473?AQB=1"
            + "&ndh=1"
            + "&t=" + timeEnc
            + "&ce=UTF-8"
            + "&ns=" + videoSettings.omniutreSuite
            + "&cdp=3"
            + "&g=" + pageUrl
            + "&cc=AUD"
            + "&events=event14"
            + "&c24=" + titleEnc
            + "&c25=" + pathEnc
            + "&c26=" + appEnc
            + "&v28=" + titleEnc
            + "&v29=" + pathEnc
            + "&v30=" + appEnc
            + "&pe=media"
            + "&pev3=" + encodeURI(path + " %2B " + media.title + " %2B " + MOVIDEO.utils.getApplicationAlias() + "--**--1--**--" + MOVIDEO.utils.getApplicationAlias() + "--**--0--**--" + currentTime.valueOf() + "--**--S0E0")
            + "&s=" + screen.width + "x" + screen.height
            + "&AQE=1";
            var sc = document.createElement('script');
            sc.type = 'text/javascript';
            sc.id = "movideo.bi.omniture";
            sc.src = url;
            var head = document.getElementsByTagName('head')[0];
            head.appendChild(sc);
            if (location.href.indexOf('debug=true') > -1) { console.log('OMNITURE URL = ' + url); }
        }
    },
    /**
    * Load the playlist tree for a given piece of media or playlist and store the result
    * for reference later.
    */
    MediaPathGenerator: function (mediaId, playlistId, readyHandler) {
        var ready = readyHandler;
        var tree = null;
        function handlePlaylist(playlist) {
            tree = playlist;
            ready();
        }
        function handlePlaylistError() {
            tree = null;
            ready();
        }
        if (mediaId == null && playlistId == null) {
            ready();
        }
        else {
            var params = new Array();
            params.push({ name: 'omitFields', value: 'creationDate,lastModifiedDate,copyright,cuePointsExist,isAdvertisement,ratio,creator,tagProfileId,imageFilename,mediaFileExists,syndicated,mediaSchedules,displayStatus,syndicatedPartners,length,podcastSupported,tagProfile,filename,status,defaultImage,mediaList' });
            // Get root playlist tree for either playlist or media id.
            if (playlistId != null) {
                MOVIDEO.media.getFirstRootPlaylistForPlaylist({
                    params: params,
                    id: playlistId,
                    depth: 10,
                    omit: true,
                    handler: handlePlaylist,
                    errorHandler: handlePlaylistError
                });
            }
            else if (mediaId != null) {
                MOVIDEO.media.getFirstRootPlaylistForMedia({
                    params: params,
                    id: mediaId,
                    depth: 10,
                    omit: true,
                    includeMedia: false,
                    handler: handlePlaylist,
                    errorHandler: handlePlaylistError
                });
            }
        }
        return {
            /**
            * Externally visible method. Combines the tree playlist playlist:code tags with the media
            * item's clip:code tag to form OAS friendly media path
            */
            getOASMediaPath: function (media) {
                var path = [];
                // First attempt to find the playlist path from the vastMediaTag value
                var tc = (videoSettings.vastMediaTag || "").split(":");
                var tagValue;
                if (tc.length == 2 && (tagValue = MOVIDEO.utils.getTagValue(media.tags, tc[0], tc[1]))) {
                    path.push(tagValue);
                } else if (tree) {
                    // Otherwise resort to the playlist tree
                    var node = tree;
                    while (node) {
                        path.push(MOVIDEO.utils.getTagValue(node.tags, "playlist", "code"));
                        node = node.childPlaylists ? node.childPlaylists.playlist : null;
                    }
                }
                path.push(MOVIDEO.utils.getTagValue(media.tags, "clip", "code"));
                if (location.href.indexOf('debug=true') > -1) { console.log('AD CALL PATH = ' + path.join("/")); }
                return path.join("/");
            }
        }
    }
};

/* ---------------------------------------------------------------------------------------- */
/* VIDEO SCROLLER
/* ---------------------------------------------------------------------------------------- */
jQuery.fn.embedPlayer = function (options) {
    var content = this;
    content.html('<div class="loading"></div>');
    // default settings
    var defaults = {
        query: '',
        mediaid: '',
        playlistid: '',
        maxvideos: 0,
        thumbnails: false,
        autoPlay: false,
        posterDisabled: false,
        posterURL: '',
        apiKey: videoSettings.apiKey,
        flashAppName: videoSettings.embedAppName,
        ipadAppName: videoSettings.embedIpadAppName
    }
    // get settings passed to the function
    var o = $.extend(defaults, options);
    if (o.thumbnails) {
        content.addClass('thumbnails');
    }
    if (o.query.indexOf('playlist/') == 0) {
        o.playlistid = extractPlaylistId(o.query);
    }
    if (o.query == '') {
        if (!isNaN(o.playlistid) && o.playlistid.length > 0) { o.query = 'playlist/' + o.playlistid + '/media'; }
        else if (!isNaN(o.mediaid) && o.mediaid.length > 0) { o.query = 'media/' + o.mediaid; }
    }
    var scroller = $(
        '<div>' +
            '<div class="player"></div>' +
        '</div>');
    if (o.thumbnails) {
        scroller.find('.player').after(
            '<div class="video-thumbnails">' +
                '<div class="list-container">' +
                    '<div class="list"></div>' +
                '</div>' +
                '<a class="up"></a>' +
                '<a class="down"></a>' +
            '</div>'
        );
    }
    // show div
    content.html(scroller);
    function setActiveThumbnail(li) {
        content.find('.list .item').not(li).removeClass('active');
        li.addClass('active');
    }
    if (o.thumbnails) {
        scroller.find('.list').videos({
            query: o.query,
            maxvideos: o.maxvideos,
            onload: function () {
                var scrollTimer = null;
                var ul = content.find('.list ul');
                var ulHeight = parseInt(ul.height());
                var scrollHeight = parseInt(content.find('.list').height());
                var bottomLimit = 0 - (ulHeight - scrollHeight);
                var topLimit = 0;
                if (!iPad) {
                    content.find('.down, .up').mouseenter(function () {
                        var top = parseInt(ul.css('top'));
                        var down = $(this).hasClass('down');
                        scrollTimer = setInterval(function () {
                            if (down && top > bottomLimit) {
                                top = top - 10;
                            }
                            else if (!down && top < topLimit) {
                                top = top + 10;
                            }
                            ul.css('top', top + 'px');
                        }, 50);
                    });
                    content.find('.down, .up').mouseleave(function () {
                        clearInterval(scrollTimer);
                        scrollTimer = null;
                    });
                }
                else {
                    content.find('.down, .up').click(function () {
                        var top = parseInt(ul.css('top'));
                        var down = $(this).hasClass('down');
                        if (down && top > bottomLimit) {
                            top = top - 50;
                        }
                        else if (!down && top < topLimit) {
                            top = top + 50;
                        }
                        ul.css('top', top + 'px');
                    });
                }
                content.find('.list .item a').click(function (e) {
                    e.preventDefault();
                    var li = $($(this).parents('.item')[0]);
                    setActiveThumbnail(li);
                    var mediaid = li.attr('mediaid');
                    var playlistid = li.attr('playlistid');
                    content.find('.player').player('play', { mediaId: mediaid, playlistId: playlistid });
                });
            }
        });
    }
    var settings = {
        apiKey: o.apiKey,
        flashAppAlias: o.flashAppName,
        iosAppAlias: o.ipadAppName,
        posterURL: o.posterURL,
        posterDisabled: o.posterDisabled,
        autoPlay: o.autoPlay
    };
    if (o.playlistid > 0) { settings.playlistId = o.playlistid };
    if (o.mediaid > 0) { settings.mediaId = o.mediaid };
    content.find('.player').player(settings);
    content.find('.player').bind('playerplay', function (event, data) {
        if (o.thumbnails) {
            var li = content.find(".list .item[mediaid='" + data.id + "']");
            setActiveThumbnail(li);
            var adPlaying = content.find('.player').player('isAdvert');
            if (!adPlaying) {
                content.find('.ad-overlay').remove();
            }
        }
        if (o.onPlay != undefined) {
            o.onPlay(data);
        }
    });
    content.find('.player').bind('playerad', function (event, data) {
        if (o.thumbnails) {
            var ad_overlay = $('<div class="ad-overlay"></div>');
            content.find('.video-thumbnails').prepend(ad_overlay);
        }
    });
};
/* ---------------------------------------------------------------------------------------- */
/* MINI MARQUEE
/* ---------------------------------------------------------------------------------------- */
(function ($) {
    $.fn.customFadeIn = function (speed, callback) {
        $(this).fadeIn(speed, function () {
            if (!$.support.opacity)
                $(this).get(0).style.removeAttribute('filter');
            if (callback != undefined)
                callback();
        });
    };
    $.fn.customFadeOut = function (speed, callback) {
        $(this).fadeOut(speed, function () {
            if (!$.support.opacity)
                $(this).get(0).style.removeAttribute('filter');
            if (callback != undefined)
                callback();
        });
    };
    $.fn.customFadeTo = function (speed, to, callback) {
        return this.animate({ opacity: to }, speed, function () {
            if (to == 1 && jQuery.browser.msie)
                this.style.removeAttribute('filter');
            if (jQuery.isFunction(callback))
                callback();
        });
    };
})(jQuery);
jQuery.fn.miniMarquee = function (query) {
    var defaultOptions = {
        query: '',
        tags: ''
    };
    var options = {};
    var args = arguments;
    if (args.length) {
        if (args[0].constructor == Object) {
            options = args[0];
        }
        else {
            options.query = args[0];
        }
    }
    var o = $.extend(defaultOptions, options);
    if (o.tags != '') {
        var tags = o.tags.split(',').reverse();
        for (var i = 0; i < tags.length; i++) {
            tags[i] = 'sport:*=' + tags[i];
        }
        o.query = "media/search?tags=" + escape(JSON.stringify(tags)) + "&tagOperator=OR&operator=OR&";
    }
    // declare variables
    var mini_video_player;
    var miniVideoPlaying;
    var hideCSS = { 'width': '0px', 'height': '0px', 'left': '144px', 'top': '90px' };
    var showCSS = { 'width': '464px', 'height': '261px', 'left': '-82px', 'top': '-15px' };
    var container = $(this);
    var video_panel;
    var large_image;
    var thumbnails;
    // create movideo parameters
    var params = [];
    params[params.length] = { name: 'omitFields', value: 'ratio,creator,tagProfileId,mediaFileExists,syndicated,mediaSchedules,displayStatus,syndicatedPartners,encodingProfiles,client,filename,status,defaultImage' };
    if (o.query.indexOf('media/search') > -1) {
        params[params.length] = { name: 'paged', value: 'true' };
        params[params.length] = { name: 'page', value: '0' };
        params[params.length] = { name: 'pageSize', value: '3' };
    }
    else if (o.query.indexOf('playlist') > -1) {
        params[params.length] = { name: 'mediaLimit', value: 3 };
    }
    getMediaList({
        query: o.query,
        params: params,
        callback: function (media) {
            if (media.length > 0) {
                container.html(
                    '<a class="close-video"></a>' +
                    '<div class="video-container"></div>' +
                    '<div class="container">' +
                        '<div class="large"><ul></ul></div>' +
                        '<div class="thumbnails"><ul></ul></div>' +
                    '</div>');
                video_panel = container.find('.video-container');
                large_image = container.find('.large');
                thumbnails = container.find('.thumbnails');
                container.find('.close-video').click(function () {
                    closeMarqueeVideo();
                });
                createMarquee(media);
                thumbnails.find('.item:first').addClass('active');
                thumbnails.find('.item').click(function () {
                    thumbnails.find('.item').not(this).removeClass('active');
                    $(this).addClass('active');
                });
                // create jcarousel functionality
                large_image.jCarouselLite({
                    visible: 1,
                    speed: 0,
                    beforeStart: function (obj) {
                        obj.parent().stop();
                        obj.parent().customFadeTo(0, 0);
                    },
                    afterEnd: function (obj) {
                        obj.parent().customFadeTo(300, 1);
                        if (miniVideoPlaying) {
                            var mediaid = obj.attr('mediaid');
                            playMarqueeVideo(mediaid);
                        }
                    },
                    btnGo: thumbnails.find('.item')
                });
                large_image.find('.item').click(function () {
                    var mediaid = $(this).attr('mediaid');
                    playMarqueeVideo(mediaid);
                });
            }
        }
    });
    function playMarqueeVideo(mediaid) {
        if (video_panel.html() == '') {
            large_image.fadeTo(800, 0.01);
            video_panel.show().css(hideCSS).animate(showCSS, 1000, function () {
                container.find('.close-video').show(500);
                var div = $('<div></div>');
                div.attr('id', 'mini_video_player');
                video_panel.html('').append(div);
                playMedia(mediaid);
            });
        }
        else {
            playMedia(mediaid);
        }
        miniVideoPlaying = true;
    }
    function playMedia(mediaid) {
        if (mini_video_player != null) {
            mini_video_player.playMedia(mediaid);
        }
        else {
            $('#mini_video_player').player({
                apiKey: videoSettings.apiKey,
                flashAppAlias: videoSettings.embedAppName,
                iosAppAlias: videoSettings.embedIpadAppName,
                autoPlay: true,
                mediaId: mediaid
            });
        }
    }
    function closeMarqueeVideo() {
        miniVideoPlaying = false;
        mini_video_player = undefined;
        container.find('.close-video').hide();
        container.find('.ad-overlay').remove();
        if (video_panel.is(':visible')) {
            video_panel.html('');
            large_image.fadeTo(1250, 1.0);
            video_panel.animate(hideCSS, 1000, function () {
                video_panel.hide();
            });
        }
    }
    function createMarquee(media) {
        for (i = 0; i < media.length; i++) {
            // get title/image/id variables from json
            var mediaid = media[i].id;
            var title = media[i].title;
            var description = media[i].description;
            var image = media[i].imagePath + '/cropped/128x72.png';
            var link = videoSettings.videoPageUrl + '?movideo_m=' + mediaid;
            var date = media[i].creationDate;
            var sporttag = media[i].show;
            var imagePath = media[i].imagePath;
            var smallimageurl = imagePath + '/cropped/128x72.png'
            var largeimageurl = imagePath + '/cropped/280x158.png'
            // create large list item
            var large_li = $(
                        '<li class="item">' +
                            '<div class="play"></div>' +
                            '<div class="image"><img /></div>' +
                            '<div class="text"></div>' +
                        '</li>');
            large_li.attr('mediaid', mediaid);
            large_li.find('.image img').attr('src', largeimageurl);
            large_li.find('.text').html(title);
            container.find('.large UL').append(large_li);
            // create thumbnail list item
            var thumb_li = $(
                        '<li class="item">' +
                            '<div class="play"></div>' +
                            '<a class="image"><img /></a>' +
                        '</li>');
            thumb_li.attr('mediaid', mediaid);
            thumb_li.find('.image img').attr('src', smallimageurl);
            thumb_li.attr('title', title);
            container.find('.thumbnails UL').append(thumb_li);
        }
    }
    var miniMarqueeAds = {
        advertChangedCallback: function (advertData) {
            var pattern = /image/;
            for (x in advertData.companionAds) {
                var y = advertData.companionAds[x];
                if (y.width == 300) {
                    var html = '';
                    if (pattern.test(y.creativeType)) {
                        html = '<a href="' + y.clickThroughUrl + '"><img border="0" width="300" height="250" src="' + y.mediaUrl + '"></a>';
                    }
                    else {
                        html = '<object width="300" height="250"><param name="movie" value="' + y.mediaUrl + '?clickTAG=' + y.clickThroughUrl + '"><embed src="' + y.mediaUrl + '?clickTAG=' + y.clickThroughUrl + '" width="300" height="250"></embed></object>';
                    }
                    $('#mrec').html(html);
                    miniMarqueeAds.showMrec();
                }
            }
        },
        controlsEnabledCallback: function (showing) {
            if (showing) {
                $('.mini-marquee').find('.ad-overlay').remove();
            }
            else {
                $('.mini-marquee').append('<div class="ad-overlay"></div>');
            }
        }
    };
};
function get_player_ad_count() {
    return ((videoAdCount == 0) || ((videoAdCount % 2) == 0)) ? '1' : '2';
}
function get_tvc_name() {
    return tvc_name;
}
function get_tvc_campaign() {
    return tvc_campaign;
}
function get_device_path() {
    return (iPad) ? '/ipad' : '';
}
/* ---------------------------------------------------------------------------------------- */
/* VIDEO SCROLLER
/* ---------------------------------------------------------------------------------------- */
jQuery.fn.videoScroller = function (options) {
    // default settings
    var defaults = {
        query: '',
        maxvideos: 18,
        showdate: true,
        showdescription: true,
        showrating: false,
        showduration: false,
        showtag: '',
        pageSize: 3,
        descriptionCharLimit: 65,
        shuffle: false
    }
    // get settings passed to the function
    var o = $.extend(defaults, options);
    var scroller = this.find('.content');
    var scrollMenu = this.find('.scrollmenu');
    scroller.videos({
        maxvideos: o.maxvideos,
        showdate: o.showdate,
        showrating: o.showrating,
        showdescription: o.showdescription,
        showduration: o.showduration,
        showtag: o.showtag,
        descriptionCharLimit: o.descriptionCharLimit,
        query: o.query,
        onload: function () {
            if (o.shuffle) {
                scroller.find('ul').shuffle();
            }
            var items = scroller.find('li');
            var pages = Math.ceil(items.length / o.pageSize);
            var windows = $('<ul class="scroller-windows" />');
            for (i = 1; i <= pages; i++) {
                var scrollerWindow = $('<li class="window" />');
                var ul = $('<ul class="video-list" />');
                var startIndex = (i - 1) * o.pageSize;
                var endIndex = startIndex + o.pageSize - 1;
                for (x = startIndex; x <= endIndex && x < items.length; x++) {
                    var video_item = $(items[x]);
                    ul.append(video_item);
                }
                scrollerWindow.append(ul);
                windows.append(scrollerWindow);
            }
            scroller.empty().append(windows);
            if (pages > 1) {
                var ul = $('<ul />');
                scrollMenu.empty().append(ul);
                for (i = 1; i <= pages; i++) {
                    ul.append('<li><a class="item">' + i + '</a></li>');
                }
                ul.before('<a class="prev" />');
                ul.after('<a class="next" />');
                ul.find('.item:first').addClass('active');
                $('.prev').addClass('disabled');
            }
            scroller.jCarouselLite({
                speed: 500,
                circular: false,
                vertical: false,
                visible: 1,
                scroll: 1,
                btnNext: scrollMenu.find('.next'),
                btnPrev: scrollMenu.find('.prev'),
                btnGo: scrollMenu.find('.item'),
                afterEnd: function (obj) {
                    var link = scrollMenu.find('.item')[obj.index()];
                    scrollMenu.find('.item').not(link).removeClass('active');
                    $(link).addClass('active');
                    var linkIndex = $(link).parent().index();
                    var lastIndex = windows.find('.window').length - 1;
                    (linkIndex == 0) ? $('.prev').addClass('disabled') : $('.prev').removeClass('disabled');
                    (linkIndex == lastIndex) ? $('.next').addClass('disabled') : $('.next').removeClass('disabled');
                }
            });
        }
    });
};
/* ---------------------------------------------------------------------------------------- */
/* HELPER FUNCTION - SHUFFLE LIST ITEMS
/* ---------------------------------------------------------------------------------------- */
(function ($) {
    $.fn.shuffle = function () {
        return this.each(function () {
            var items = $(this).children();
            return (items.length)
        ? $(this).html($.shuffle(items))
        : this;
        });
    }
    $.shuffle = function (arr) {
        for (
      var j, x, i = arr.length; i;
      j = parseInt(Math.random() * i),
      x = arr[--i], arr[i] = arr[j], arr[j] = x
    );
        return arr;
    }
})(jQuery);

function loadSponsorLinks(linkurl) {
    if (linkurl != undefined) {
        if (linkurl.length > 0) {
            
            $(document).ready(function() {
                $('.sponsor-link').css('cursor', 'pointer');
                $('.sponsor-link').click(function() {
                    window.open(linkurl);
                });
            });
    
        }
    }
}eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('(2($){$.c.f=2(p){p=$.d({g:"!@#$%^&*()+=[]\\\\\\\';,/{}|\\":<>?~`.- ",4:"",9:""},p);7 3.b(2(){5(p.G)p.4+="Q";5(p.w)p.4+="n";s=p.9.z(\'\');x(i=0;i<s.y;i++)5(p.g.h(s[i])!=-1)s[i]="\\\\"+s[i];p.9=s.O(\'|\');6 l=N M(p.9,\'E\');6 a=p.g+p.4;a=a.H(l,\'\');$(3).J(2(e){5(!e.r)k=o.q(e.K);L k=o.q(e.r);5(a.h(k)!=-1)e.j();5(e.u&&k==\'v\')e.j()});$(3).B(\'D\',2(){7 F})})};$.c.I=2(p){6 8="n";8+=8.P();p=$.d({4:8},p);7 3.b(2(){$(3).f(p)})};$.c.t=2(p){6 m="A";p=$.d({4:m},p);7 3.b(2(){$(3).f(p)})}})(C);',53,53,'||function|this|nchars|if|var|return|az|allow|ch|each|fn|extend||alphanumeric|ichars|indexOf||preventDefault||reg|nm|abcdefghijklmnopqrstuvwxyz|String||fromCharCode|charCode||alpha|ctrlKey||allcaps|for|length|split|1234567890|bind|jQuery|contextmenu|gi|false|nocaps|replace|numeric|keypress|which|else|RegExp|new|join|toUpperCase|ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('|'),0,{}));/*
    
    jQuery selectBox (version 1.0.2)
    
        A cosmetic, styleable replacement for SELECT elements.
    
        Homepage:   http://abeautifulsite.net/blog/2011/01/jquery-selectbox-plugin/
        Demo page:  http://labs.abeautifulsite.net/projects/js/jquery/selectBox/
        
        Copyright 2011 Cory LaViska for A Beautiful Site, LLC.
        
    Features:
        - Supports OPTGROUPS
        - Supports standard dropdown controls
        - Supports multi-select controls (i.e. multiple="multiple")
        - Supports inline controls (i.e. size="5")
        - Fully accessible via keyboard
        - Shift + click (or shift + enter) to select a range of options in multi-select controls
        - Type to search when the control has focus
        - Auto-height based on the size attribute (to use, omit the height property in your CSS!)
        - Tested in IE7-IE9, Firefox 3-4, recent webkit browsers, and Opera
    
    
    License:
        
        Licensed under both the MIT license and the GNU GPLv2 (same as jQuery: http://jquery.org/license)
    
    
    Usage:
        
        Link to the JS file:
            
            <script src="jquery.selectbox.min.js" type="text/javascript"></script>
        
        Add the CSS file (or append contents to your own stylesheet):
        
            <link href="jquery.selectbox.min.css" rel="stylesheet" type="text/css" />
        
        To create:
            
            $("SELECT").selectBox([settings]);
    
    
    Settings:
        
        To specify settings, use this syntax: $("SELECT").selectBox('settings', { settingName: value, ... });
            
            menuTransition: ['default', 'slide', 'fade'] - the show/hide transition for dropdown menus
            menuSpeed: [integer, 'slow', 'normal', 'fast'] - the show/hide transition speed
    
    
    Methods:
        
        To call a method use this syntax: $("SELECT").selectBox('methodName', [options]);
        
            create - Creates the control (default method)
            destroy - Destroys the selectBox control and reverts back to the original form control
            disable - Disables the control (i.e. disabled="disabled")
            enable - Enables the control
            value - if passed with a value, sets the control to that value; otherwise returns the current value
            options - pass in either a string of HTML or a JSON object to replace the existing options
            control - returns the selectBox control element (an anchor tag) for working with directly
    
    
    Events:
        
        Events are fired on the original select element. You can bind events like this:
            
            $("SELECT").selectBox().change( function() { alert( $(this).val() ); } );
            
            focus - Fired when the control gains focus
            blur - Fired when the control loses focus
            change - Fired when the value of a control changes
    
    
    Change Log:
        
        v1.0.0 (2011-04-03) - Complete rewrite with added support for inline and multi-select controls
        v1.0.1 (2011-04-04) - Fixed options method so it doesn't destroy/recreate the control when called.
                            - Added a check for iOS devices (their native controls are much better for 
                              touch-based devices; you can still use selectBox API methods for theme)
                            - Fixed issue where IE window would lose focus on XP
                            - Fixed premature selection issue in Webkit browsers
        v1.0.2 (2011-04-13) - Fixed auto-height for inline controls when control is invisible on load
                            - Removed auto-width for dropdown and inline controls; now relies 100% on CSS
                              for setting the width
                               - Added 'control' method for working directly with the selectBox control
                              
    Known Issues:
    
        - The blur and focus callbacks are not very reliable in IE7. The change callback works fine.
    
*/
if(jQuery) (function($) {
    
    $.extend($.fn, {
        
        selectBox: function(method, data) {
            
            var typeTimer, typeSearch = '';
            
            
            //
            // Private methods
            //
            
            
            var init = function(select, data) {
                
                // Disable for iOS devices (their native controls are more suitable for a touch device)
                if( navigator.userAgent.match(/iPad|iPhone/i) ) return false;
                
                // Element must be a select control
                if( select.tagName.toLowerCase() !== 'select' ) return false;
                
                select = $(select);
                if( select.data('selectBox-control') ) return false;
                
                var control = $('<a class="selectBox" />'),
                    inline = select.attr('multiple') || parseInt(select.attr('size')) > 1;
                
                var settings = data || {};
                
                // Inherit class names, style, and title attributes
                control
                    .addClass(select.attr('class'))
                    .attr('style', select.attr('style') || '')
                    .attr('title', select.attr('title') || '')
                    .attr('tabindex', parseInt(select.attr('tabindex')))
                    .css('display', 'inline-block')
                    .bind('focus.selectBox', function() {
                        if( this !== document.activeElement ) $(document.activeElement).blur();
                        if( control.hasClass('selectBox-active') ) return;
                        control.addClass('selectBox-active');
                        select.trigger('focus');
                    })
                    .bind('blur.selectBox', function() {
                        if( !control.hasClass('selectBox-active') ) return;
                        control.removeClass('selectBox-active');
                        select.trigger('blur');
                    });
                
                if( select.attr('disabled') ) control.addClass('selectBox-disabled');
                
                // Generate control
                if( inline ) {
                    
                    //
                    // Inline controls
                    //
                    var options = getOptions(select, 'inline');
                    
                    control
                        .append(options)
                        .data('selectBox-options', options)
                        .addClass('selectBox-inline')
                        .addClass('selectBox-menuShowing')
                        .bind('keydown.selectBox', function(event) {
                            handleKeyDown(select, event);
                        })
                        .bind('keypress.selectBox', function(event) {
                            handleKeyPress(select, event);
                        })
                        .insertAfter(select);
                    
                    // Auto-height based on size attribute
                    if( !select[0].style.height ) {
                        
                        var size = select.attr('size') ? parseInt(select.attr('size')) : 5,
                            optionHeight = parseInt(control.find('.selectBox-options A:first').outerHeight());
                        
                        // If the control is invisible, we have to draw a dummy control 
                        // off-screen, measure the option, and remove it
                        if( !select.is(':visible') ) {
                            var tmp = control
                                .clone()
                                .removeAttr('id')
                                .css({
                                    position: 'absolute',
                                    top: '-9999em'
                                })
                                .show()
                                .appendTo('body');
                            optionHeight = parseInt(tmp.find('.selectBox-options A:first').html('&nbsp;').outerHeight());
                            tmp.remove();
                        }
                        
                        control.height(optionHeight * size);
                        
                    }
                    
                    disableSelection(control);
                    
                } else {
                    
                    //
                    // Dropdown controls
                    //
                    
                    var label = $('<span class="selectBox-label" />'),
                        arrow = $('<span class="selectBox-arrow" />');
                    
                    label.text( $(select).find('OPTION:selected').text() || '\u00A0' );
                    
                    var options = getOptions(select, 'dropdown');
                    options.appendTo('BODY');
                    
                    control
                        .data('selectBox-options', options)
                        .addClass('selectBox-dropdown')
                        .append(label)
                        .append(arrow)
                        .bind('mousedown.selectBox', function(event) {
                            if( control.hasClass('selectBox-menuShowing') ) {
                                hideMenus();
                            } else {
                                event.stopPropagation();
                                // Webkit fix to prevent premature selection of options
                                options.data('selectBox-down-at-x', event.screenX).data('selectBox-down-at-y', event.screenY);
                                showMenu(select);
                            }
                        })
                        .bind('keydown.selectBox', function(event) {
                            handleKeyDown(select, event);
                        })
                        .bind('keypress.selectBox', function(event) {
                            handleKeyPress(select, event);
                        })
                        .insertAfter(select);
                    
                    disableSelection(control);
                        
                }
                
                // Store data for later use and show the control
                select
                    .addClass('selectBox')
                    .data('selectBox-control', control)
                    .data('selectBox-settings', settings)
                    .hide();
                
            };
            
            
            var getOptions = function(select, type) {
                
                var options;
                
                switch( type ) {
                    
                    case 'inline':
                        
                        options = $('<ul class="selectBox-options" />');
                        
                        if( select.find('OPTGROUP').length ) {
                            
                            select.find('OPTGROUP').each( function() {
                                
                                var optgroup = $('<li class="selectBox-optgroup" />');
                                optgroup.text($(this).attr('label'));
                                options.append(optgroup);
                                
                                $(this).find('OPTION').each( function() {
                                    var li = $('<li />'),
                                        a = $('<a />');
                                    li.addClass( $(this).attr('class') );
                                    a.attr('rel', $(this).val()).text( $(this).text() );
                                    li.append(a);
                                    if( $(this).attr('disabled') ) li.addClass('selectBox-disabled');
                                    if( $(this).attr('selected') ) li.addClass('selectBox-selected');
                                    options.append(li);
                                });
                                
                            });
                        
                        } else {
                        
                            select.find('OPTION').each( function() {
                                var li = $('<li />'),
                                    a = $('<a />');
                                li.addClass( $(this).attr('class') );
                                a.attr('rel', $(this).val()).text( $(this).text() );
                                li.append(a);
                                if( $(this).attr('disabled') ) li.addClass('selectBox-disabled');
                                if( $(this).attr('selected') ) li.addClass('selectBox-selected');
                                options.append(li);
                            });
                            
                        }
                        
                        options
                            .find('A')
                                .bind('mouseover.selectBox', function(event) {
                                    addHover(select, $(this).parent());
                                })
                                .bind('mouseout.selectBox', function(event) {
                                    removeHover(select, $(this).parent());
                                })
                                .bind('mousedown.selectBox', function(event) {
                                    event.preventDefault(); // Prevent options from being "dragged"
                                })
                                .bind('mouseup.selectBox', function(event) {
                                    hideMenus();
                                    if( event.shiftKey ) {
                                        selectOption(select, $(this).parent(), true);
                                    } else {
                                        selectOption(select, $(this).parent(), false);
                                    }
                                });
                        
                        disableSelection(options);
                        
                        return options;
                    
                    case 'dropdown':
                        
                        options = $('<ul class="selectBox-dropdown-menu selectBox-options" />');
                        
                        if( select.find('OPTGROUP').length ) {
                            
                            select.find('OPTGROUP').each( function() {
                                
                                var optgroup = $('<li class="selectBox-optgroup" />');
                                optgroup.text($(this).attr('label'));
                                options.append(optgroup);
                                
                                $(this).find('OPTION').each( function() {
                                    var li = $('<li />'),
                                        a = $('<a />');
                                    li.addClass( $(this).attr('class') );
                                    a.attr('rel', $(this).val()).text( $(this).text() );
                                    li.append(a);
                                    if( $(this).attr('disabled') ) li.addClass('selectBox-disabled');
                                    if( $(this).attr('selected') ) li.addClass('selectBox-selected');
                                    options.append(li);
                                });
                                
                            });
                            
                        } else {
                            
                            select.find('OPTION').each( function() {
                                var li = $('<li />'),
                                    a = $('<a />');
                                li.addClass( $(this).attr('class') );
                                a.attr('rel', $(this).val()).text( $(this).text() );
                                li.append(a);
                                if( $(this).attr('disabled') ) li.addClass('selectBox-disabled');
                                if( $(this).attr('selected') ) li.addClass('selectBox-selected');
                                options.append(li);
                            });
                            
                        }
                        
                        options
                            .data('selectBox-select', select)
                            .css('display', 'none')
                            .appendTo('BODY')
                            .find('A')
                                .bind('mousedown.selectBox', function(event) {
                                    event.preventDefault(); // Prevent options from being "dragged"
                                    if( event.screenX === options.data('selectBox-down-at-x') && event.screenY === options.data('selectBox-down-at-y') ) {
                                        options.removeData('selectBox-down-at-x').removeData('selectBox-down-at-y');
                                        hideMenus();
                                    }
                                })
                                .bind('mouseup.selectBox', function(event) {
                                    if( event.screenX === options.data('selectBox-down-at-x') && event.screenY === options.data('selectBox-down-at-y') ) {
                                        return;
                                    } else {
                                        options.removeData('selectBox-down-at-x').removeData('selectBox-down-at-y');
                                    }
                                    selectOption(select, $(this).parent());
                                    hideMenus();
                                }).bind('mouseover.selectBox', function(event) {
                                    addHover(select, $(this).parent());
                                })
                                .bind('mouseout.selectBox', function(event) {
                                    removeHover(select, $(this).parent());
                                });
                        
                        disableSelection(options);
                        
                        return options;
                    
                }
                
            };
            
            
            var destroy = function(select) {
                
                select = $(select);
                
                var control = select.data('selectBox-control');
                if( !control ) return;
                var options = control.data('selectBox-options');
                
                options.remove();
                control.remove();
                select
                    .removeClass('selectBox')
                    .removeData('selectBox-control')
                    .removeData('selectBox-settings')
                    .show();
                
            };
            
            
            var showMenu = function(select) {
                
                select = $(select);
                var control = select.data('selectBox-control'),
                    settings = select.data('selectBox-settings'),
                    options = control.data('selectBox-options');
                if( control.hasClass('selectBox-disabled') ) return false;
                
                hideMenus();
                
                // Show menu
                options.css({
                    width: control.outerWidth() - (parseInt(control.css('borderLeftWidth')) + parseInt(control.css('borderLeftWidth'))),
                    top: control.offset().top + control.outerHeight() - (parseInt(control.css('borderBottomWidth'))),
                    left: control.offset().left
                });
                
                switch( settings.menuTransition ) {
                    
                    case 'fade':
                        options.fadeIn(settings.menuSpeed);
                        break;
                    
                    case 'slide':
                        options.slideDown(settings.menuSpeed);
                        break;
                    
                    default:
                        options.show(settings.menuSpeed);
                        break;
                    
                }
                
                // Center on selected option
                var li = options.find('.selectBox-selected:first');
                keepOptionInView(select, li, true);
                addHover(select, li);
                
                control.addClass('selectBox-menuShowing');
                
                $(document).bind('mousedown.selectBox', function(event) {
                    if( $(event.target).parents().andSelf().hasClass('selectBox-options') ) return;
                    hideMenus();
                });
                
            };
            
            
            var hideMenus = function() {
                
                if( $(".selectBox-dropdown-menu").length === 0 ) return;
                $(document).unbind('mousedown.selectBox');
                
                $(".selectBox-dropdown-menu").each( function() {
                    
                    var options = $(this),
                        select = options.data('selectBox-select'),
                        control = select.data('selectBox-control'),
                        settings = select.data('selectBox-settings');
                    
                    switch( settings.menuTransition ) {
                        
                        case 'fade':
                            options.fadeOut(settings.menuSpeed);
                            break;
                        
                        case 'slide':
                            options.slideUp(settings.menuSpeed);
                            break;
                            
                        default:
                            options.hide(settings.menuSpeed);
                            break;
                        
                    }
                    
                    control.removeClass('selectBox-menuShowing');
                    
                });
                
            };
            
            
            var selectOption = function(select, li, selectRange) {
                
                select = $(select);
                li = $(li);
                var control = select.data('selectBox-control'),
                    settings = select.data('selectBox-settings');
                
                if( control.hasClass('selectBox-disabled') ) return false;
                if( li.length === 0 || li.hasClass('selectBox-disabled') ) return false;
                
                if( select.attr('multiple') ) {
                    
                    // If selectRange is true, this will select all options between li and the last li selected
                    if( selectRange && control.data('selectBox-last-selected') ) {
                        
                        li.toggleClass('selectBox-selected');
                        
                        var affectedOptions;
                        if( li.index() > control.data('selectBox-last-selected').index() ) {
                            affectedOptions = li.siblings().slice(control.data('selectBox-last-selected').index(), li.index());
                        } else {
                            affectedOptions = li.siblings().slice(li.index(), control.data('selectBox-last-selected').index());
                        }
                        
                        affectedOptions = affectedOptions.not('.selectBox-optgroup, .selectBox-disabled');
                        
                        if( li.hasClass('selectBox-selected') ) {
                            affectedOptions.addClass('selectBox-selected');
                        } else {
                            affectedOptions.removeClass('selectBox-selected');
                        }
                        
                    } else {
                        li.toggleClass('selectBox-selected');
                    }
                    
                } else {
                    li.siblings().removeClass('selectBox-selected');
                    li.addClass('selectBox-selected');
                }
                
                if( control.hasClass('selectBox-dropdown') ) {
                    control.find('.selectBox-label').text(li.text());
                }
                
                // Update original control's value
                var i = 0, selection = [];
                if( select.attr('multiple') ) {
                    control.find('.selectBox-selected A').each( function() {
                        selection[i++] = $(this).attr('rel');
                    });
                } else {
                    selection = li.find('A').attr('rel');
                }
                
                // Remember most recently selected item
                control.data('selectBox-last-selected', li);
                
                // Change callback
                if( select.val() !== selection ) {
                    select.val(selection);
                    select.trigger('change');
                }
                
                return true;
                
            };
            
            
            var addHover = function(select, li) {
                select = $(select);
                li = $(li);
                var control = select.data('selectBox-control'),
                    options = control.data('selectBox-options');
                
                options.find('.selectBox-hover').removeClass('selectBox-hover');
                li.addClass('selectBox-hover');
            };
            
            
            var removeHover = function(select, li) {
                select = $(select);
                li = $(li);
                var control = select.data('selectBox-control'),
                    options = control.data('selectBox-options');
                options.find('.selectBox-hover').removeClass('selectBox-hover');
            };
            
            
            var keepOptionInView = function(select, li, center) {
                
                if( !li || li.length === 0 ) return;
                
                select = $(select);
                var control = select.data('selectBox-control'),
                    options = control.data('selectBox-options'),
                    scrollBox = control.hasClass('selectBox-dropdown') ? options : options.parent(),
                    top = parseInt(li.offset().top - scrollBox.position().top),
                    bottom = parseInt(top + li.outerHeight());
                
                if( center ) {
                    scrollBox.scrollTop( li.offset().top - scrollBox.offset().top + scrollBox.scrollTop() - (scrollBox.height() / 2) );
                } else {
                    if( top < 0 ) {
                        scrollBox.scrollTop( li.offset().top - scrollBox.offset().top + scrollBox.scrollTop() );
                    }
                    if( bottom > scrollBox.height() ) {
                        scrollBox.scrollTop( (li.offset().top + li.outerHeight()) - scrollBox.offset().top + scrollBox.scrollTop() - scrollBox.height() );
                    }
                }
                
            };
            
            
            var handleKeyDown = function(select, event) {
                
                //
                // Handles open/close and arrow key functionality
                //
                
                select = $(select);
                var control = select.data('selectBox-control'),
                    options = control.data('selectBox-options'),
                    totalOptions = 0,
                    i = 0;
                
                if( control.hasClass('selectBox-disabled') ) return;
                
                switch( event.keyCode ) {
                    
                    case 8: // backspace
                        event.preventDefault();
                        typeSearch = '';
                        break;
                    
                    case 9: // tab
                    case 27: // esc
                        hideMenus();
                        removeHover(select);
                        break;
                    
                    case 13: // enter
                        if( control.hasClass('selectBox-menuShowing') ) {
                            selectOption(select, options.find('LI.selectBox-hover:first'), event.shiftKey);
                            if( control.hasClass('selectBox-dropdown') ) hideMenus();
                        } else {
                            showMenu(select);
                        }
                        break;
                        
                    case 38: // up
                    case 37: // left
                        
                        event.preventDefault();
                        
                        if( control.hasClass('selectBox-menuShowing') ) {
                            
                            var prev = options.find('.selectBox-hover').prev('LI');
                            totalOptions = options.find('LI:not(.selectBox-optgroup)').length;
                            i = 0;
                            
                            while( prev.length === 0 || prev.hasClass('selectBox-disabled') || prev.hasClass('selectBox-optgroup') ) {
                                prev = prev.prev('LI');
                                if( prev.length === 0 ) prev = options.find('LI:last');
                                if( ++i >= totalOptions ) break;
                            }
                            
                            addHover(select, prev);
                            keepOptionInView(select, prev);
                            
                        } else {
                            showMenu(select);
                        }
                        
                        break;
                        
                    case 40: // down
                    case 39: // right
                    
                        event.preventDefault();
                        
                        if( control.hasClass('selectBox-menuShowing') ) {
                            
                            var next = options.find('.selectBox-hover').next('LI');
                            totalOptions = options.find('LI:not(.selectBox-optgroup)').length;
                            i = 0;
                            
                            while( next.length === 0 || next.hasClass('selectBox-disabled') || next.hasClass('selectBox-optgroup') ) {
                                next = next.next('LI');
                                if( next.length === 0 ) next = options.find('LI:first');
                                if( ++i >= totalOptions ) break;
                            }
                            
                            addHover(select, next);
                            keepOptionInView(select, next);
                            
                        } else {
                            showMenu(select);
                        }
                        
                        break;
                        
                }
                
            };
            
            
            var handleKeyPress = function(select, event) {
                
                //
                // Handles type-to-find functionality
                //
                
                select = $(select);
                var control = select.data('selectBox-control'),
                    options = control.data('selectBox-options');
                
                if( control.hasClass('selectBox-disabled') ) return;
                
                switch( event.keyCode ) {
                    
                    case 9: // tab
                    case 27: // esc
                    case 13: // enter
                    case 38: // up
                    case 37: // left
                    case 40: // down
                    case 39: // right
                        // Don't interfere with the keydown event!
                        break;
                    
                    default: // Type to find
                        
                        if( !control.hasClass('selectBox-menuShowing') ) showMenu(select);
                        
                        event.preventDefault();
                        
                        clearTimeout(typeTimer);
                        typeSearch += String.fromCharCode(event.charCode || event.keyCode);
                        
                        options.find('A').each( function() {
                            if( $(this).text().substr(0, typeSearch.length).toLowerCase() === typeSearch.toLowerCase() ) {
                                addHover(select, $(this).parent());
                                keepOptionInView(select, $(this).parent());
                                return false;
                            }
                        });
                        
                        // Clear after a brief pause
                        typeTimer = setTimeout( function() { typeSearch = ''; }, 1000);
                        
                        break;
                        
                }
                
            };
            
            
            var enable = function(select) {
                select = $(select);
                select.attr('disabled', false);
                var control = select.data('selectBox-control');
                if( !control ) return;
                control.removeClass('selectBox-disabled');
            };
            
            
            var disable = function(select) {
                select = $(select);
                select.attr('disabled', true);
                var control = select.data('selectBox-control');
                if( !control ) return;
                control.addClass('selectBox-disabled');
            };
            
            
            var setValue = function(select, value) {
                select = $(select);
                select.val(value);
                value = select.val();
                var control = select.data('selectBox-control'),
                    settings = select.data('selectBox-settings'),
                    options = control.data('selectBox-options');
                if( !control ) return;
                
                // Update label
                control.find('.selectBox-label').text( $(select).find('OPTION:selected').text() || '\u00A0' );
                
                // Update control values
                options.find('.selectBox-selected').removeClass('selectBox-selected');
                options.find('A').each( function() {
                    if( typeof(value) === 'object' ) {
                        for( var i = 0; i < value.length; i++ ) {
                            if( $(this).attr('rel') == value[i] ) {
                                $(this).parent().addClass('selectBox-selected');
                            }
                        }
                    } else {
                        if( $(this).attr('rel') == value ) {
                            $(this).parent().addClass('selectBox-selected');
                        }
                    }
                });
                
                if( settings.change ) settings.change.call(select);
                
            };
            
            
            var setOptions = function(select, options) {
                
                select = $(select);
                var control = select.data('selectBox-control'),
                    settings = select.data('selectBox-settings');
                
                switch( typeof(data) ) {
                    
                    case 'string':
                        select.html(data);
                        break;
                        
                    case 'object':
                        select.html('');
                        for( var i in data ) {
                            if( data[i] === null ) continue;
                            if( typeof(data[i]) === 'object' ) {
                                var optgroup = $('<optgroup label="' + i + '" />');
                                for( var j in data[i] ) {
                                    optgroup.append('<option value="' + j + '">' + data[i][j] + '</option>');
                                }
                                select.append(optgroup);
                            } else {
                                var option = $('<option value="' + i + '">' + data[i] + '</option>');
                                select.append(option);
                            }
                        }
                        break;
                    
                }
                
                if( !control ) return;
                
                // Remove old options
                control.data('selectBox-options').remove();
                
                // Generate new options
                var type = control.hasClass('selectBox-dropdown') ? 'dropdown' : 'inline',
                    options = getOptions(select, type);
                control.data('selectBox-options', options);
                
                switch( type ) {
                    case 'inline':
                        control.append(options);
                        break;
                    case 'dropdown':
                        control.find('.selectBox-label').text( $(select).find('OPTION:selected').text() || '\u00A0' );
                        $("BODY").append(options);
                        break;
                }
                
            };
            
            
            var disableSelection = function(selector) {
                $(selector)
                    .css('MozUserSelect', 'none')
                    .bind('selectstart', function(event) {
                        event.preventDefault();
                    });
            };
            
            
            //
            // Public methods
            //
            
            
            switch( method ) {
                
                case 'control':
                    return $(this).data('selectBox-control');
                    break;
                
                case 'settings':
                    if( !data ) return $(this).data('selectBox-settings');
                    $(this).each( function() {
                        $(this).data('selectBox-settings', $.extend(true, $(this).data('selectBox-settings'), data));
                    });
                    break;
                
                case 'options':
                    $(this).each( function() {
                        setOptions(this, data);
                    });
                    break;
                
                case 'value':
                    if( !data ) return $(this).val();
                    $(this).each( function() {
                        setValue(this, data);
                    });
                    break;
                
                case 'enable':
                    $(this).each( function() {
                        enable(this);
                    });
                    break;
                
                case 'disable':
                    $(this).each( function() {
                        disable(this);
                    });
                    break;
                
                case 'destroy':
                    $(this).each( function() {
                        destroy(this);
                    });
                    break;
                
                default:
                    $(this).each( function() {
                        init(this, method);
                    });
                    break;
                
            }
            
            return $(this);
            
        }
        
    });
    
})(jQuery);function initSelectBox($selectObject){
    $selectObject
        .selectBox()
        .change( function() {
            if($(this).is('.metric')){
                selectMetricEventHandle($(this));
            } else if($(this).is('.oven')){
                selectOvenEventHandle($(this));
            }
        });
}
function initInputField(){
    $("input").bind("change blur",function(){
        if($(this).val() == ""){
            $(this).val($(this).attr('d-value'));
        }
    });
    
    $('input.numeric').numeric({allow:"."})
    
    $('input.numeric').focus(function(){ 
        var value = $(this).val();
        if (!isNumber(value)){
            $(this).val(""); 
        }
    });
}

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}
                    
var fieldid = 1;
function drawFormSet(fieldid){    
    var dynamicForm = '<div class="clear dynamic-field">' +
                    '<div><input id="fc-serve-amt-'+fieldid+'" name="fc-serve-amt-'+fieldid+'" type="text" class="ingredient numeric" value="quantity '+fieldid+'" d-value="quantity '+fieldid+'"/></div>'+
                        '<div>'+
                            '<select id="fc-serve-unit-'+fieldid+'" name="fc-serve-unit-'+fieldid+'" class="mini ingredient">'+
                                    '<option value="-">Select</option>'+
                                    '<option value="litre">Litre</option>'+
                                    '<option value="millilitre">Millilitre</option>'+
                                    '<option value="cup">Cup</option>'+
                                    '<option value="tablespoon">Tablespoon</option>'+
                                    '<option value="teaspoon">Teaspoon</option>'+
                                    '<option value="kilogram">Kilogram</option>'+
                                    '<option value="gram">Gram</option>'+
                                    '<option value="pound">Pound</option>'+
                                    '<option value="ounce">Ounce</option>'+
                            '</select>'+
                        '</div>'+
                        '<div><input id="fc-serve-ans-'+fieldid+'" name="fc-serve-ans-'+fieldid+'" type="text" class="ingredient-answer answer" readonly="true" value="answer"/></div>'+
                    '</div>';
    $(dynamicForm).appendTo("#dynamic-field-wrapper");
    //init input box
    initInputField();
}
$(function() {
//init select box
initSelectBox($(".fc-select SELECT"));
//init input box
initInputField();
    $("#add-field").bind("click",function(){
        fieldid = fieldid + 1;
        drawFormSet(fieldid);
        initSelectBox($("#fc-serve-unit-"+fieldid));
    });
    $(".food-calculator a.serve").bind("click",function(){
        $("#food-calulator-serving").show();
        $("#food-calulator-metric").hide();
        $("#food-calulator-oven").hide();
    });
    $(".food-calculator a.oven").bind("click",function(){
        $("#food-calulator-serving").hide();
        $("#food-calulator-metric").hide();
        $("#food-calulator-oven").show();
    });
    $(".food-calculator a.metric").bind("click",function(){
        $("#food-calulator-serving").hide();
        $("#food-calulator-metric").show();
        $("#food-calulator-oven").hide();
    });
    
    $(".food-calculator-mini a.oven").bind("click",function(){
        $("#food-calulator-metric-mini").hide();
        $("#food-calulator-oven-mini").show();
    });
    $(".food-calculator-mini a.metric").bind("click",function(){
        $("#food-calulator-metric-mini").show();
        $("#food-calulator-oven-mini").hide();
    });
    
});
function selectOvenEventHandle(selectObject){
    var selectId = selectObject.attr('id');
    if(selectObject.is('.widget')){
        $("#fc-mini-oven-fahrenheit").selectBox('value', selectObject.val());
        $("#fc-mini-oven-celsius").selectBox('value', selectObject.val());
    } else {
        $("#fc-oven-fahrenheit").selectBox('value', selectObject.val());
        $("#fc-oven-celsius").selectBox('value', selectObject.val());
    }
    if(selectObject.val() != "-"){
        $(".oven-fan").html($("#"+selectId+"  option:selected").attr('fan') + "&deg;C");
        $(".oven-gas").html($("#"+selectId+"  option:selected").attr('gas'));
        $(".oven-heat").html($("#"+selectId+"  option:selected").attr('heat'));
    } else {
        $(".oven-fan").html("answer");
        $(".oven-gas").html("answer");
        $(".oven-heat").html("answer");
    }
}
function selectMetricEventHandle(selectObject){
    var weight_group = new Array("ounce","pound","gram","kilogram");
    var liquid_group = new Array("litre","millilitre","cup","tablespoon","teaspoon");
    var array_group;
    if(in_array(selectObject.val(),weight_group)){
        var selectMetricOptions = {
            "-":"Select",
            kilogram:"Kilogram",
            gram:"Gram",
            pound:"Pound",
            ounce:"Ounce"            
        };
        $("#fc-metric-type").val("weight");
    } else {
        var selectMetricOptions = {
            "-":"Select",
            litre:"Litre",
            millilitre:"Millilitre",
            cup:"Cup",
            tablespoon:"Tablespoon",
            teaspoon:"Teaspoon"
        };
        $("#fc-metric-type").val("liquid");
    }
    if(selectObject.is('.widget')){
        $("#fc-mini-metric-to-unit").selectBox('options', selectMetricOptions);
        $("#fc-mini-metric-to").val("answer");
    } else{
        $("#fc-metric-to-unit").selectBox('options', selectMetricOptions);
        $("#fc-metric-to").val("answer");
    }
}
function in_array (needle, haystack, argStrict) {
    var key = '',
        strict = !! argStrict;
    if (strict) {
        for (key in haystack) {
            if (haystack[key] === needle) {
                return true;
            }
        }
    } else {
        for (key in haystack) {
            if (haystack[key] == needle) {
                return true;
            }
        }
    }
    return false;
}
function calculateServing(){
    var org_value = $("#fc-serve-org").val();
    var new_value = $("#fc-serve-new").val();
    var amt;
    var unit;
    var i=1;
    $("#dynamic-field-wrapper .dynamic-field").each(function(){
        amt = $("#fc-serve-amt-"+i).val();
        unit = $("#fc-serve-unit-"+i).val();
        calculateResult(i, org_value, new_value, amt, unit);
        i++;
    });
    
    return false;
}
function calculateResult(i, org_value, new_value, amt, unit){
    if((unit != "-")&&(org_value != "")&&(new_value != "")){
        var value = (amt/org_value) * new_value;
        value = Math.round(value*100)/100;
        $("#fc-serve-ans-"+i).val(value);
    }
}
function convertMetric(mini){
    var value = 0;
    var result_field;
    var convert_value;
    var metric_to;
    var metric_from;
    var metric_type;
    
    if(mini){
        result_field = $("#fc-mini-metric-to");
        convert_value = $("#fc-mini-metric-from").val();
        metric_from = $("#fc-mini-metric-from-unit").val();
        metric_to = $("#fc-mini-metric-to-unit").val();
        metric_type = $("#fc-metric-type").val();
    } else {
        result_field = $("#fc-metric-to");
        convert_value = $("#fc-metric-from").val();
        metric_from = $("#fc-metric-from-unit").val();
        metric_to = $("#fc-metric-to-unit").val();
        metric_type = $("#fc-metric-type").val();
    }
      
    result_field.val(convertMetricType(convert_value, metric_type, metric_from, metric_to));
}
function convertMetricType(n,opt,s,e){
    var result = 0;
    var weightDb = {
                    ounce:35.3, 
                    pound:2.2, 
                    gram:1000, 
                    kilogram:1                    
                };
    var liquidDb = {
                    litre:1, 
                    millilitre:1000, 
                    cup:4, 
                    tablespoon:50,
                    teaspoon:200                
                };
    if((s != "-") && (e != "-") && (n != "number")){
        if(opt=="weight"){
            result = (n * eval("weightDb."+e)) / eval("weightDb."+s);
        }else{
            result = (n * eval("liquidDb."+e)) / eval("liquidDb."+s);
        }
        return Math.round(result*100)/100;
    } else {
        return "answer";
    }
}
if (top.location != location) {
    top.location.href = self.location;
  }
/**
 * SWFObject v1.4: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
 *
 * SWFObject is (c) 2006 Geoff Stearns and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 * **SWFObject is the SWF embed script formerly known as FlashObject. The name was changed for
 *   legal reasons.
 */
if(typeof deconcept=="undefined"){var deconcept=new Object();}
if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}
if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}
deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a,_b){
if(!document.createElement||!document.getElementById){return;}
this.DETECT_KEY=_b?_b:"detectflash";
this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);
this.params=new Object();
this.variables=new Object();
this.attributes=new Array();
if(_1){this.setAttribute("swf",_1);}
if(id){this.setAttribute("id",id);}
if(w){this.setAttribute("width",w);}
if(h){this.setAttribute("height",h);}
if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}
this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion(this.getAttribute("version"),_7);
if(c){this.addParam("bgcolor",c);}
var q=_8?_8:"best";
this.addParam("quality",q);
this.setAttribute("useExpressInstall",_7);
this.setAttribute("doExpressInstall",false);
var _d=(_9)?_9:window.location;
this.setAttribute("xiRedirectUrl",_d);
this.setAttribute("redirectUrl","");
if(_a){this.setAttribute("redirectUrl",_a);}};
deconcept.SWFObject.prototype={setAttribute:function(_e,_f){
this.attributes[_e]=_f;
},getAttribute:function(_10){
return this.attributes[_10];
},addParam:function(_11,_12){
this.params[_11]=_12;
},getParams:function(){
return this.params;
},addVariable:function(_13,_14){
this.variables[_13]=_14;
},getVariable:function(_15){
return this.variables[_15];
},getVariables:function(){
return this.variables;
},getVariablePairs:function(){
var _16=new Array();
var key;
var _18=this.getVariables();
for(key in _18){
_16.push(key+"="+_18[key]);}
return _16;
},getSWFHTML:function(){
var _19="";
if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){
if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");}
_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\"";
_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";
var _1a=this.getParams();
for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}
var _1c=this.getVariablePairs().join("&");
if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}
_19+="/>";
}else{
if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");}
_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\">";
_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";
var _1d=this.getParams();
for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}
var _1f=this.getVariablePairs().join("&");
if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}
_19+="</object>";}
return _19;
},write:function(_20){
if(this.getAttribute("useExpressInstall")){
var _21=new deconcept.PlayerVersion([6,0,65]);
if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){
this.setAttribute("doExpressInstall",true);
this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));
document.title=document.title.slice(0,47)+" - Flash Player Installation";
this.addVariable("MMdoctitle",document.title);}}
if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){
var n=(typeof _20=="string")?document.getElementById(_20):_20;
n.innerHTML=this.getSWFHTML();
return true;
}else{
if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}
return false;}};
deconcept.SWFObjectUtil.getPlayerVersion=function(_23,_24){
var _25=new deconcept.PlayerVersion([0,0,0]);
if(navigator.plugins&&navigator.mimeTypes.length){
var x=navigator.plugins["Shockwave Flash"];
if(x&&x.description){_25=new deconcept.PlayerVersion(x.description.replace(/([a-z]|[A-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}
}else{try{
var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
for(var i=3;axo!=null;i++){
axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+i);
_25=new deconcept.PlayerVersion([i,0,0]);}}
catch(e){}
if(_23&&_25.major>_23.major){return _25;}
if(!_23||((_23.minor!=0||_23.rev!=0)&&_25.major==_23.major)||_25.major!=6||_24){
try{_25=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}
catch(e){}}}
return _25;};
deconcept.PlayerVersion=function(_29){
this.major=parseInt(_29[0])!=null?parseInt(_29[0]):0;
this.minor=parseInt(_29[1])||0;
this.rev=parseInt(_29[2])||0;};
deconcept.PlayerVersion.prototype.versionIsValid=function(fv){
if(this.major<fv.major){return false;}
if(this.major>fv.major){return true;}
if(this.minor<fv.minor){return false;}
if(this.minor>fv.minor){return true;}
if(this.rev<fv.rev){return false;}return true;};
deconcept.util={getRequestParameter:function(_2b){
var q=document.location.search||document.location.hash;
if(q){
var _2d=q.indexOf(_2b+"=");
var _2e=(q.indexOf("&",_2d)>-1)?q.indexOf("&",_2d):q.length;
if(q.length>1&&_2d>-1){
return q.substring(q.indexOf("=",_2d)+1,_2e);
}}return "";}};
if(Array.prototype.push==null){
Array.prototype.push=function(_2f){
this[this.length]=_2f;
return this.length;};}
var getQueryParamValue=deconcept.util.getRequestParameter;
var FlashObject=deconcept.SWFObject; // for backwards compatibility
var SWFObject=deconcept.SWFObject;/**
* hoverIntent r6 // 2011.02.26 // jQuery 1.5.1+
* <http://cherne.net/brian/resources/jquery.hoverIntent.html>
* 
* @param  f  onMouseOver function || An object with configuration options
* @param  g  onMouseOut function  || Nothing (use configuration options object)
* @author    Brian Cherne brian(at)cherne(dot)net
*/
(function($){$.fn.hoverIntent=function(f,g){var cfg={sensitivity:7,interval:100,timeout:0};cfg=$.extend(cfg,g?{over:f,out:g}:f);var cX,cY,pX,pY;var track=function(ev){cX=ev.pageX;cY=ev.pageY};var compare=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);if((Math.abs(pX-cX)+Math.abs(pY-cY))<cfg.sensitivity){$(ob).unbind("mousemove",track);ob.hoverIntent_s=1;return cfg.over.apply(ob,[ev])}else{pX=cX;pY=cY;ob.hoverIntent_t=setTimeout(function(){compare(ev,ob)},cfg.interval)}};var delay=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);ob.hoverIntent_s=0;return cfg.out.apply(ob,[ev])};var handleHover=function(e){var ev=jQuery.extend({},e);var ob=this;if(ob.hoverIntent_t){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t)}if(e.type=="mouseenter"){pX=ev.pageX;pY=ev.pageY;$(ob).bind("mousemove",track);if(ob.hoverIntent_s!=1){ob.hoverIntent_t=setTimeout(function(){compare(ev,ob)},cfg.interval)}}else{$(ob).unbind("mousemove",track);if(ob.hoverIntent_s==1){ob.hoverIntent_t=setTimeout(function(){delay(ev,ob)},cfg.timeout)}}};return this.bind('mouseenter',handleHover).bind('mouseleave',handleHover)}})(jQuery);/* ---------------------------------------------------------------------------------------- */
/* NAV MENU INITIALISE FUNCTION - using hoverIntent (AT)
/* ---------------------------------------------------------------------------------------- */
function initNav() {
    $('#nav-primary > ul > li').each(function () {
        var id = $(this).attr('class');
        var link = $(this).find('a:first');
        if (link.attr('id') == '') {
            link.attr('id', id);
        }
    });
    $('#nav-primary > ul > li > a').each(function () {
        var id = $(this).attr('id');
        var li = $(this).parent();
        var subItems = $('#' + id + '-dropdown');
        if (subItems.length > 0) {
            li.append(subItems);
        }
    });
        
        $("#nav-primary > UL > LI").hoverIntent({
            sensitivity: 100,
            interval: 50,
            timeout: 200,
            over: function () {
                var dropdown = $(this).find('.nav-dropdown');
                var link = $(this).find('a:first');
                // hide all other open dropdowns
                $('.nav-dropdown').not(dropdown).hide();
                $('#nav-primary > ul > li > a').not(link).removeClass('hover');
                // show dropdown
                dropdown.fadeIn(200);
                $(this).children('a').addClass('hover');
            },
            out: function () {
                $(this).find(".nav-dropdown").fadeOut(50);
                $(this).children('a').removeClass('hover');
            }
        });
   
}function initDS29() {
    $(".counter-number").each(function (i) {
        $(this).attr('id', 'num' + i);
    });
    function loadticker(ticnum) {
        var fticnum = add_commas(ticnum);
        var numheight = 31;
        addticker(fticnum);
        if (ticnum && ticnum != 0) {
            var s = String(fticnum);
            for (i = s.length; i >= 0; i--) {
                var onum = s.charAt(i);
                $("#num" + i).attr('value', onum);
            }
            $(".counter-number").each(function () {
                var nval = $(this).attr("value");
                if (!isNaN(nval)) {
                    var nheight = Number(nval) * numheight * -1;
                    $(this).animate({
                        top: nheight + 'px'
                    }, 2500);
                }
                if (nval == ',') {
                    $(this).animate({
                        top: '-310px'
                    }, 2500);
                }
            });
        }
    }
    function addticker(newnum) {
        var digitcnt = $(".counter-number").size();
        var nnum = String(newnum).length;
        var digitdiff = Number(nnum - Number(digitcnt));
        if (digitdiff < 0) {
            var ltdig = (Number(nnum) - 1);
            $(".counter-number:gt(" + ltdig + ")").remove();
        }
        for (i = 1; i <= digitdiff; i++) {
            $(".counter-wrap").append('<div class="counter-number" id="num' + (Number(digitcnt + i - 1)) + '">&nbsp;</div>');
        }
    }
    function add_commas(nStr) {
        nStr += '';
        x = nStr.split('.');
        x1 = x[0];
        x2 = x.length > 1 ? '.' + x[1] : '';
        var rgx = /(\d+)(\d{3})/;
        while (rgx.test(x1)) {
            x1 = x1.replace(rgx, '$1' + ',' + '$2');
        }
        return x1 + x2;
    }
    function add_leading_zero(number, width) {
        width -= number.toString().length;
        if (width > 0) return new Array(width + (/\./.test(number) ? 2 : 1)).join('0') + number;
        return number;
    }
    var url = "http://graph.facebook.com/MasterChefAustralia&callback=?";
    var likes_length = "7";
    var check_fb_timeout = null;
    function check_fb_num() {
        if (check_fb_timeout) {
            clearTimeout(check_fb_timeout);
        }
        check_fb_timeout = setTimeout(check_fb_num, 10000);
        $.ajax({
            url: url,
            dataType: 'jsonp',
            success: function (data) {
                var likes_num = data.likes;
                likes_num = add_leading_zero(likes_num, likes_length);
                loadticker(likes_num);
            }
        });
    }
    check_fb_num();
}function dtf(date, format) {
    var f = format;
    var h = date.getHours();
    if (f.indexOf('ap') > -1) h = date.getHours() == 0 ? 12 : date.getHours() > 12 ? date.getHours() - 12 : date.getHours();
    f = f.replace(/HH/g, (h < 10 ? '0' : '') + h);
    f = f.replace(/MM/g, (date.getMinutes() < 10 ? '0' : '') + date.getMinutes());
    f = f.replace(/SS/g, (date.getSeconds() < 10 ? '0' : '') + date.getSeconds());
    f = f.replace(/ap/g, date.getHours() < 12 ? 'am' : 'pm');
    f = f.replace(/yyyy/g, date.getFullYear());
    f = f.replace(/mmm/g, months(date.getMonth()));
    f = f.replace(/mm/g, (date.getMonth() < 9 ? '0' : '') + (date.getMonth() + 1));
    f = f.replace(/ddd/g, contractions(date.getDate()));
    f = f.replace(/dd/g, (date.getDate() < 10 ? '0' : '') + date.getDate());
    return f;
    function contractions(val) {
        var str = val + "";
        str = str.replace(/(11|12|13)$/, "$1th");
        str = str.replace(/1$/, "1st");
        str = str.replace(/2$/, "2nd");
        str = str.replace(/3$/, "3rd");
        str = str.replace(/(\d)$/, "$1th");
        return str;
    }
}
function days(idx) {
    var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
    if (idx != undefined && idx >= 0 && idx < 7) return days[idx];
    return days;
}
function months(idx) {
    var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    if (idx != undefined && idx >= 0 && idx < 12) return months[idx];
    return months;
}
function loadProgram(programid) {
    $.ajax({
        url: '/epgdata/programe_guide_' + dtf(new Date(), 'yyyy-mm-dd') + '.JSON',
        dataType: 'json',
        success: function (data) {
            var prog = null;
            for (var i = 0; i < data.Programs.length; i++) {
                if (data.Programs[i].ProgramId == programid) {
                    prog = data.Programs[i];
                    break;
                }
            }
            var ts = $('#tg-shedule');
            var cValue = getCookie('epg-region');
            if (cValue.length == 0) {
                cValue = 73;
            } else {
                cValue = parseInt(cValue);
                ts.find('.filter.region_id a').removeClass('current');
                ts.find('.filter.region_id a[val="' + cValue + '"]').addClass('current');
            }
            if (prog) {
                var region = null;
                for (var i = 0; i < prog.Regions.length; i++) {
                    if (prog.Regions[i].RegionId == cValue) {
                        region = prog.Regions[i];
                        break;
                    }
                }
                if (region) {
                    ts.find('.event-date').html(region.Event.Date);
                } else {
                    $('.logo-wrap .DS28').hide();
                }
            }
            ts.data('epgdata', data);
            ts.find('.filter.region_id a').click(function (evt) {
                evt.preventDefault();
                ts.find('.filter.region_id a').removeClass('current');
                $(this).addClass("current");
                var cValue = parseInt($(this).attr('val'));
                setCookie('epg-region', cValue, 190);
                for (var i = 0; i < prog.Regions.length; i++) {
                    if (prog.Regions[i].RegionId == cValue) {
                        region = prog.Regions[i];
                        break;
                    }
                }
                ts.find('.event-date').html(region.Event.Date);
            });
        },
        error: function () {
            $('.logo-wrap .DS28').hide();
        }
    });
}/* Function used to do the renovators judge sliding marquee (AT) */
/* Added IE7 fix (BR) */
function judgeSlider() {
    $('.judge-slider .text, .judge-slider .text *').css({
        opacity: 0
    });
    $('.judge-slider .link').mouseenter(function () {
        if ($.browser.msie && parseInt($.browser.version) == 7) {$(this).css("background-position", "0 0");}

        $(this).stop().animate({width: '343px',opacity: 1}, 500);
        $(this).find('.text, .text *').animate({opacity: 1}, 500);
        $('.judge-slider .link').not(this).each(function () {

            if ($.browser.msie && parseInt($.browser.version) == 7) { $(this).css("background-position", "-120px 0"); }

            if ($(this).width() != 120) {$(this).stop().animate({ width: '86px',opacity: 0.4 }, 500);}
            $(this).find('.text, .text *').stop().css({ opacity: 0 });
        });
    });
    $('.judge-slider').mouseleave(function () {
        if ($.browser.msie && parseInt($.browser.version) == 7) {$('.judge-slider .link').css("background-position", "-100px 0")}

        $('.judge-slider .link').stop().animate({ width: '150px',opacity: 1 }, 500);
        $('.judge-slider .text, .judge-slider .text *').stop().css({ opacity: 0 });
    });
}



