/* DART adserving */

jQuery.fn.dart = function($params) {
    
    var $defaults = {
        ads_sitename: jQuery("meta[name=ads_sitename]:first").attr("content") || 'uk.lovefilm.home',
        ads_zone: jQuery("meta[name=ads_zone]:first").attr("content") || 'other',
        ads_kv: jQuery("meta[name=ads_kv]:first").attr("content") || '',
        ads_availableSizes: /^(728x90|468x60|728x90,468x60|300x250|160x600,120x600|800x300|974x300|634x500|23x1|5x5|100x1|300x1)$/,
        ads_availableZones:  /[a-zA-Z0-9_]+/,
        ads_availableTypes: /^(ad|adj|adi|adx|pfadx|jump)$/,
        ads_availableKV: /[a-zA-Z0-9_]+=[a-zA-Z0-9_]+/,
        debug: 0,
        min_display_width: 1100,
        buffer_width: 100,
        start_slot: 0,
        reset_tile: 0,
        inStream_dart_tag: '',
        inSkin: 0
    };
    
    var $p = jQuery.extend($defaults, $params);
    var $this = jQuery(this);
    
    // Clean the KV
    if ($p.ads_kv.length > 0) {
        $p.ads_kv = ';'+escape($p.ads_kv).replace(/%3D/g,'=').replace(/%3B/g,';').replace(/%2C/g,',').replace(/%20/g,'_');
        var kv_array = $p.ads_kv.split(';');
        var new_kv = '';
        for (i=1; i <= (kv_array.length-1); i++) {
            if ($p.ads_availableKV.test(kv_array[i])) {
                new_kv += ';'+kv_array[i];
            }
        }
        $p.ads_kv = new_kv;
    }
    
    if (typeof(document.ads_mpu_tile_val) == 'undefined') {
        document.ads_mpu_tile_val = 0;
    }
    if (typeof(document.ads_sponsored_links_tile_val) == 'undefined') {
        document.ads_sponsored_links_tile_val = 0;
    }
    
    if (typeof(document.ads_dfp_ord)=='undefined') {
        document.ads_dfp_ord=Math.floor(Math.random()*999999999);
    }
    if (typeof(document.ads_dfp_slot) == 'undefined') {
        document.ads_dfp_slot = $p.start_slot;
    }
    if (typeof(document.ads_dc_seed) == 'undefined') {
        document.ads_dc_seed = 0;
    }
    
    // who knows?
    var rsi_segs = [];
    var segs_beg = document.cookie.indexOf('rsi_segs=');
    if (segs_beg >= 0) {
        segs_beg = document.cookie.indexOf('=',segs_beg)+1;
        if (segs_beg > 0) {
            var segs_end = document.cookie.indexOf(';',segs_beg);
            if (segs_end == -1) {
                segs_end = document.cookie.length;
            }
        }
        var rsi_segs = document.cookie.substring(segs_beg,segs_end).split('|');
        segArr=new Array();
        for (var i=0;i<rsi_segs.length && i<20;i++) {
            segArr.push('rsi='+rsi_segs[i].split('_')[1]);
        }
        if (segArr.length) {
            if ($p.ads_kv.length > 0) {
                $p.ads_kv = $p.ads_kv +';' + segArr.join(';');
            } else {
                $p.ads_kv = ';' + segArr.join(';');
            }
        }
    }
    
    // helper
    function _getMaxDimensions(sz) {
        allSizes = sz.split(",");
        maxSizes = Array(0,0);
        for (i = 0; i < allSizes.length; i++) {
            curSize = allSizes[i].split("x");
            if (curSize[0] > maxSizes[0]) { maxSizes[0] = curSize[0]; }
            if (curSize[1] > maxSizes[1]) { maxSizes[1] = curSize[1]; }
        }
        return maxSizes;
    }
    
    // url
    function _generateDart(sz, pos, adType, ist) {
        var refsh = '';
        //if (location.protocol=='https:') {
        //    return '';
        //}
        if (typeof(sz)=='undefined' || !$p.ads_availableSizes.test(sz)) {
            return '';
        }
        if (typeof(pos)!='undefined' && pos.length>0) {
            pos=';pos='+pos;
        } else {
            pos='';
        }
        var zone = $p.ads_zone;
        if (!$p.ads_availableZones.test(zone)) {
            return '';
        }
        if ( (typeof(document.ads_dfp_tile)=='undefined') || ist ) {
            document.ads_dfp_tile=1;
            //var ads_dfp_dcopt=';dcopt=ist';
            var ads_dfp_dcopt='';
        } else if (ist) {
            var ads_dfp_dcopt='';
        } else {
            document.ads_dfp_tile++;
            var ads_dfp_dcopt='';
        }
        if ((sz === '300x250') && !document.ads_mpu_tile_val) {
            document.ads_mpu_tile_val = document.ads_dfp_tile;
        }
        if ((sz === '300x1') && !document.ads_sponsored_links_tile_val) {
            document.ads_sponsored_links_tile_val = document.ads_dfp_tile;
        }
        
        var ad_slot = '';
        if ( (typeof(document.ads_dfp_slot) != 'undefined') ) {
            ad_slot = ';slot='+document.ads_dfp_slot;
        }
        
        var ads_local_dfp_tile = '';
        if (adType != 'ad' && adType != 'jump') {
            var tile_val = document.ads_dfp_tile;
            if (sz === '300x250') {
                tile_val = document.ads_mpu_tile_val;
            }
            if (sz === '300x1') {
                tile_val = document.ads_sponsored_links_tile_val;
            }
            ads_local_dfp_tile = ';tile='+tile_val;
        }
        if (adType == 'adj' || adType == 'adx') {
            adType = 'adx';
            var ads_dfp_dcopt = ';dcmt=text/html;dcopt=ist';
        }
        var ord = (adType != 'pfadx') ? ';ord='+document.ads_dfp_ord : '';
        var dc_seed = (document.ads_dc_seed) ? ';dc_seed='+document.ads_dc_seed : '';
        return 'http://ad.uk.doubleclick.net/'+adType+'/' + $p.ads_sitename + '/' + zone + ads_local_dfp_tile + ads_dfp_dcopt + ad_slot + $p.ads_kv + pos + ';sz=' + sz + ';refresh=' + refsh + ord + dc_seed;
    }
    
    function generateInSkin() {
        $.getScript("http://inskin.vo.llnwd.net/o21/ikit/default/js/inskin_load.js", function() {
            var InSkinParams = new Array();
            InSkinParams['srv_SectionID'] = '123583';
            InSkinParams['srv_SectionIDPlay'] = '';
            InSkinParams['srv_Keywords'] = '';
            InSkinParams['srv_Categories'] = '';
            InSkinParams['srv_UseSAS'] = 'true';
            InSkinParams['sas_PrerollAdTag'] = '';
            InSkinParams['sas_PauseAdTag'] = _encode_inskin('634x500');
            InSkinParams['plr_InSkinID'] = 'myInSkin1';
            InSkinParams['plr_ContentID'] = 'InSkinFlashPlayer';
            InSkinParams['plr_ContentW'] = '480';//'574';
            InSkinParams['plr_ContentH'] = '360';//'450';
            InSkinParams['plr_FrameTop'] = '60';
            InSkinParams['plr_FrameSide'] = '30';
            InSkinParams['plr_FrameBottom'] = '40';
            InSkinParams['plr_InSkinW'] = '540';//'634';
            InSkinParams['plr_InSkinH'] = '460';//'550';
            InSkinParams['plr_TotalW'] = '900';
            InSkinParams['plr_TotalH'] = '600';
            InSkinParams['plr_ContentType'] = 'LOVEFILM';
            InSkinParams['plr_ExpandableDetached'] = 'true';
            InSkinParams['plr_NoSkinContentResize'] = 'false';//'true';
            InSkinParams['plr_NoSkinContentW'] = '574';
            InSkinParams['plr_NoSkinContentH'] = '450';
            InSkinParams['plr_NoSkinInSkinResize'] = 'true';
            InSkinParams['plr_NoSkinInSkinW'] = '540';
            InSkinParams['plr_NoSkinInSkinH'] = '360';
            InSkinLoad.init(InSkinParams);
        });
    }
    
    function _encode_inskin(sz) {
        var pos = 0;
        var adjURL = _generateDart(sz, pos, 'adj', 1);
        //var jumpURL = _generateDart(sz, pos, 'jump', 0);
        //var adURL = _generateDart(sz, pos, 'ad', 0);
        return encodeURIComponent("<script type=\"text/javascript\" src=\""+adjURL+"\"></script>");
    }
    
    function _Dart_increment_value(href,k,i) {
        var re = new RegExp("([;])"+k+"=([^;]+)");
        var match = href.match(re);
        var v = match[2];
        v = parseInt(v,10) + i;
        return href.replace(re, "$1"+k+"="+v);
    }
    
    function getDcSeed(inStreamTag) {
        var seed;
        if (inStreamTag.length > 0) {
            var kv_array = inStreamTag.split(';');
            for (i=1; i <= (kv_array.length-1); i++) {
                var pairs = kv_array[i].split("=");
                if (pairs[0] == 'dc_seed') {
                    seed = pairs[1];
                }
            }
        }
        return seed;
    }
    
    var newMethods = {
        generateDartTag: function() {
            jQuery(this).each(function() {
                if ($p.inStream_dart_tag) {
                    document.ads_dc_seed = getDcSeed($p.inStream_dart_tag);
                }
                var offset = jQuery(this).offset();
                var ad_offset = offset.left + $p.buffer_width;
                var is_overflow = 0;
                if (ad_offset >= $p.min_display_width) {
                    is_overflow = 1;
                }
                var parent_is_hidden = (jQuery(this).parent().is(':hidden')) ? 1 : 0;
                if (parent_is_hidden || (is_overflow && (jQuery(window).width() < $p.min_display_width))) {
                    // Ad won't fit on page
                    // or is deliberatly disabled - Don't display.
                } else {
                    var sz = jQuery(this).attr('data-sz');
                    var pos = jQuery(this).attr('data-pos') || 0;
                    var adType = jQuery(this).attr('data-adType') || 'adi';
                    var sTagUrl = _generateDart(sz, pos, adType, 0);
                    if (sTagUrl.length > 0) {
                        switch(adType) {
                        case "ad":
                            jQuery(this).DartTag_imageOnly(sTagUrl);
                            break;
                        case "adj":
                            jQuery(this).DartTag_js(sTagUrl);
                            break;
                        case "adi":
                            jQuery(this).DartTag_iframe(sz,pos,sTagUrl);
                            break;
                        }
                    }
                    if ($p.debug) {print_sTagUrl(sz,sTagUrl);}
                }
            });
        },
        getAvodDartTag: function(sz, slot) {
            var pos = 0;
            if (slot) {
                document.ads_dfp_slot = slot;
            } else {
                document.ads_dfp_slot++;
            }
            document.ads_dfp_tile = $p.reset_tile;
            var inStream = _generateDart(sz, pos, 'pfadx', 0);
            return inStream;
        },
        DartTag_imageOnly: function(sTagUrl) {
            jQuery(this).html('<img src="'+sTagUrl+'">');
        },
        DartTag_iframe: function(sz,pos,sTagUrl) {
            var sIframeId = sz+'-'+pos;
            var aMaxDimensions = _getMaxDimensions(sz);
            jQuery(this)
                .attr('data-dart_src', sTagUrl)
                .attr('data-dart_size', sz)
                .attr('data-dart_id', sIframeId)
                .html('<iframe id="dart'+sIframeId+'" name="'+sIframeId+'" src="'+sTagUrl+'" framespacing="0" frameborder="no" scrolling="no" allowtransparency="true" width="'+aMaxDimensions[0]+'" height="'+aMaxDimensions[1]+'" class="gen_jquery_dart" ></iframe>').hide().fadeIn(300);
        },
        // reload function
        r_DartTag_iframe: function() {
            var id = jQuery(this).attr('data-dart_id');
            var src = jQuery(this).attr('data-dart_src');
            src = _Dart_increment_value(src,'ord',50);
            var sz = jQuery(this).attr('data-dart_size');
            var aMaxDimensions = _getMaxDimensions(sz);
            if ($p.debug) {print_sTagUrl(sz,src);}
            if (src) {
                jQuery(this).hide().html('<iframe id="dart'+id+'" name="'+id+'" src="'+src+'" framespacing="0" frameborder="no" scrolling="no" allowtransparency="true" width="'+aMaxDimensions[0]+'" height="'+aMaxDimensions[1]+'" ></iframe>').show();
            }
        },
        DartTag_js: function(sTagUrl) {
            $.getScript(sTagUrl);
            jQuery(this).html('<div class="hidden">advertisment</div>'); // Injected into container so it's non-empty
        },
        reset_slot_position: function(pos) {
            if (typeof(document.ads_dfp_slot) != 'undefined') {
                document.ads_dfp_slot = pos || 0;
            }
        },
        delay_milliseconds: function(time, callback) {
            return this.animate({ opacity: '+=0' }, time, callback);
        }
    };
    
    jQuery.each(newMethods, function(i) {
        jQuery.fn[i] = this;
    });
    
    function print_sTagUrl(sz,sTagUrl) {
        jQuery('body').prepend('<pre><strong>'+sz+':</strong> '+sTagUrl+'</pre>');
    }
    
    if ( jQuery('#InSkinIDiv_myInSkin1').length > 0 ) {
        generateInSkin();
    }
    
    if (!$p.inSkin) {
        return this.each(function() {
            $this = $(this);
        });
    } else {
        jQuery('div.dart').generateDartTag();
    }
};

