/*
 * Autocomplete - jQuery plugin 1.0.2
 *
 * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id: jquery.autocomplete.js 5747 2008-06-25 18:30:55Z joern.zaefferer $
 *
 */;(function($){$.fn.extend({autocomplete:function(urlOrData,options){var isUrl=typeof urlOrData=="string";options=$.extend({},$.Autocompleter.defaults,{url:isUrl?urlOrData:null,data:isUrl?null:urlOrData,delay:isUrl?$.Autocompleter.defaults.delay:10,max:options&&!options.scroll?10:150},options);options.highlight=options.highlight||function(value){return value;};options.formatMatch=options.formatMatch||options.formatItem;return this.each(function(){new $.Autocompleter(this,options);});},result:function(handler){return this.bind("result",handler);},search:function(handler){return this.trigger("search",[handler]);},flushCache:function(){return this.trigger("flushCache");},setOptions:function(options){return this.trigger("setOptions",[options]);},unautocomplete:function(){return this.trigger("unautocomplete");}});$.Autocompleter=function(input,options){var KEY={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8};var $input=$(input).attr("autocomplete","off").addClass(options.inputClass);var timeout;var previousValue="";var cache=$.Autocompleter.Cache(options);var hasFocus=0;var lastKeyPressCode;var config={mouseDownOnSelect:false};var select=$.Autocompleter.Select(options,input,selectCurrent,config);var blockSubmit;$.browser.opera&&$(input.form).bind("submit.autocomplete",function(){if(blockSubmit){blockSubmit=false;return false;}});$input.bind(($.browser.opera?"keypress":"keydown")+".autocomplete",function(event){lastKeyPressCode=event.keyCode;switch(event.keyCode){case KEY.UP:event.preventDefault();if(select.visible()){select.prev();}else{onChange(0,true);}break;case KEY.DOWN:event.preventDefault();if(select.visible()){select.next();}else{onChange(0,true);}break;case KEY.PAGEUP:event.preventDefault();if(select.visible()){select.pageUp();}else{onChange(0,true);}break;case KEY.PAGEDOWN:event.preventDefault();if(select.visible()){select.pageDown();}else{onChange(0,true);}break;case options.multiple&&$.trim(options.multipleSeparator)==","&&KEY.COMMA:case KEY.TAB:case KEY.RETURN:if(selectCurrent()){event.preventDefault();blockSubmit=true;return false;}break;case KEY.ESC:select.hide();break;default:clearTimeout(timeout);timeout=setTimeout(onChange,options.delay);break;}}).focus(function(){hasFocus++;}).blur(function(){hasFocus=0;if(!config.mouseDownOnSelect){hideResults();}}).click(function(){if(hasFocus++>1&&!select.visible()){onChange(0,true);}}).bind("search",function(){var fn=(arguments.length>1)?arguments[1]:null;function findValueCallback(q,data){var result;if(data&&data.length){for(var i=0;i<data.length;i++){if(data[i].result.toLowerCase()==q.toLowerCase()){result=data[i];break;}}}if(typeof fn=="function")fn(result);else $input.trigger("result",result&&[result.data,result.value]);}$.each(trimWords($input.val()),function(i,value){request(value,findValueCallback,findValueCallback);});}).bind("flushCache",function(){cache.flush();}).bind("setOptions",function(){$.extend(options,arguments[1]);if("data"in arguments[1])cache.populate();}).bind("unautocomplete",function(){select.unbind();$input.unbind();$(input.form).unbind(".autocomplete");});function selectCurrent(){var selected=select.selected();if(!selected)return false;var v=selected.result;previousValue=v;if(options.multiple){var words=trimWords($input.val());if(words.length>1){v=words.slice(0,words.length-1).join(options.multipleSeparator)+options.multipleSeparator+v;}v+=options.multipleSeparator;}$input.val(v);hideResultsNow();$input.trigger("result",[selected.data,selected.value]);return true;}function onChange(crap,skipPrevCheck){if(lastKeyPressCode==KEY.DEL){select.hide();return;}var currentValue=$input.val();if(!skipPrevCheck&&currentValue==previousValue)return;previousValue=currentValue;currentValue=lastWord(currentValue);if(currentValue.length>=options.minChars){$input.addClass(options.loadingClass);if(!options.matchCase)currentValue=currentValue.toLowerCase();request(currentValue,receiveData,hideResultsNow);}else{stopLoading();select.hide();}};function trimWords(value){if(!value){return[""];}var words=value.split(options.multipleSeparator);var result=[];$.each(words,function(i,value){if($.trim(value))result[i]=$.trim(value);});return result;}function lastWord(value){if(!options.multiple)return value;var words=trimWords(value);return words[words.length-1];}function autoFill(q,sValue){if(options.autoFill&&(lastWord($input.val()).toLowerCase()==q.toLowerCase())&&lastKeyPressCode!=KEY.BACKSPACE){$input.val($input.val()+sValue.substring(lastWord(previousValue).length));$.Autocompleter.Selection(input,previousValue.length,previousValue.length+sValue.length);}};function hideResults(){clearTimeout(timeout);timeout=setTimeout(hideResultsNow,200);};function hideResultsNow(){var wasVisible=select.visible();select.hide();clearTimeout(timeout);stopLoading();if(options.mustMatch){$input.search(function(result){if(!result){if(options.multiple){var words=trimWords($input.val()).slice(0,-1);$input.val(words.join(options.multipleSeparator)+(words.length?options.multipleSeparator:""));}else
$input.val("");}});}if(wasVisible)$.Autocompleter.Selection(input,input.value.length,input.value.length);};function receiveData(q,data){if(data&&data.length&&hasFocus){stopLoading();select.display(data,q);autoFill(q,data[0].value);select.show();}else{hideResultsNow();}};function request(term,success,failure){if(!options.matchCase)term=term.toLowerCase();var data=cache.load(term);if(data&&data.length){success(term,data);}else if((typeof options.url=="string")&&(options.url.length>0)){var extraParams={timestamp:+new Date()};$.each(options.extraParams,function(key,param){extraParams[key]=typeof param=="function"?param():param;});$.ajax({mode:"abort",port:"autocomplete"+input.name,dataType:options.dataType,url:options.url,data:$.extend({q:lastWord(term),limit:options.max},extraParams),success:function(data){var parsed=options.parse&&options.parse(data)||parse(data);cache.add(term,parsed);success(term,parsed);}});}else{select.emptyList();failure(term);}};function parse(data){var parsed=[];var rows=data.split("\n");for(var i=0;i<rows.length;i++){var row=$.trim(rows[i]);if(row){row=row.split("|");parsed[parsed.length]={data:row,value:row[0],result:options.formatResult&&options.formatResult(row,row[0])||row[0]};}}return parsed;};function stopLoading(){$input.removeClass(options.loadingClass);};};$.Autocompleter.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",minChars:1,delay:400,matchCase:false,matchSubset:true,matchContains:false,cacheLength:10,max:100,mustMatch:false,extraParams:{},selectFirst:true,formatItem:function(row){return row[0];},formatMatch:null,autoFill:false,width:0,multiple:false,multipleSeparator:", ",highlight:function(value,term){return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"<strong>$1</strong>");},scroll:true,scrollHeight:180};$.Autocompleter.Cache=function(options){var data={};var length=0;function matchSubset(s,sub){if(!options.matchCase)s=s.toLowerCase();var i=s.indexOf(sub);if(i==-1)return false;return i==0||options.matchContains;};function add(q,value){if(length>options.cacheLength){flush();}if(!data[q]){length++;}data[q]=value;}function populate(){if(!options.data)return false;var stMatchSets={},nullData=0;if(!options.url)options.cacheLength=1;stMatchSets[""]=[];for(var i=0,ol=options.data.length;i<ol;i++){var rawValue=options.data[i];rawValue=(typeof rawValue=="string")?[rawValue]:rawValue;var value=options.formatMatch(rawValue,i+1,options.data.length);if(value===false)continue;var firstChar=value.charAt(0).toLowerCase();if(!stMatchSets[firstChar])stMatchSets[firstChar]=[];var row={value:value,data:rawValue,result:options.formatResult&&options.formatResult(rawValue)||value};stMatchSets[firstChar].push(row);if(nullData++<options.max){stMatchSets[""].push(row);}};$.each(stMatchSets,function(i,value){options.cacheLength++;add(i,value);});}setTimeout(populate,25);function flush(){data={};length=0;}return{flush:flush,add:add,populate:populate,load:function(q){if(!options.cacheLength||!length)return null;if(!options.url&&options.matchContains){var csub=[];for(var k in data){if(k.length>0){var c=data[k];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub.push(x);}});}}return csub;}else
if(data[q]){return data[q];}else
if(options.matchSubset){for(var i=q.length-1;i>=options.minChars;i--){var c=data[q.substr(0,i)];if(c){var csub=[];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub[csub.length]=x;}});return csub;}}}return null;}};};$.Autocompleter.Select=function(options,input,select,config){var CLASSES={ACTIVE:"ac_over"};var listItems,active=-1,data,term="",needsInit=true,element,list;function init(){if(!needsInit)return;element=$("<div/>").hide().addClass(options.resultsClass).css("position","absolute").appendTo(document.body);list=$("<ul/>").appendTo(element).mouseover(function(event){if(target(event).nodeName&&target(event).nodeName.toUpperCase()=='LI'){active=$("li",list).removeClass(CLASSES.ACTIVE).index(target(event));$(target(event)).addClass(CLASSES.ACTIVE);}}).click(function(event){$(target(event)).addClass(CLASSES.ACTIVE);select();input.focus();return false;}).mousedown(function(){config.mouseDownOnSelect=true;}).mouseup(function(){config.mouseDownOnSelect=false;});if(options.width>0)element.css("width",options.width);needsInit=false;}function target(event){var element=event.target;while(element&&element.tagName!="LI")element=element.parentNode;if(!element)return[];return element;}function moveSelect(step){listItems.slice(active,active+1).removeClass(CLASSES.ACTIVE);movePosition(step);var activeItem=listItems.slice(active,active+1).addClass(CLASSES.ACTIVE);if(options.scroll){var offset=0;listItems.slice(0,active).each(function(){offset+=this.offsetHeight;});if((offset+activeItem[0].offsetHeight-list.scrollTop())>list[0].clientHeight){list.scrollTop(offset+activeItem[0].offsetHeight-list.innerHeight());}else if(offset<list.scrollTop()){list.scrollTop(offset);}}};function movePosition(step){active+=step;if(active<0){active=listItems.size()-1;}else if(active>=listItems.size()){active=0;}}function limitNumberOfItems(available){return options.max&&options.max<available?options.max:available;}function fillList(){list.empty();var max=limitNumberOfItems(data.length);for(var i=0;i<max;i++){if(!data[i])continue;var formatted=options.formatItem(data[i].data,i+1,max,data[i].value,term);if(formatted===false)continue;var li=$("<li/>").html(options.highlight(formatted,term)).addClass(i%2==0?"ac_even":"ac_odd").appendTo(list)[0];$.data(li,"ac_data",data[i]);}listItems=list.find("li");if(options.selectFirst){listItems.slice(0,1).addClass(CLASSES.ACTIVE);active=0;}if($.fn.bgiframe)list.bgiframe();}return{display:function(d,q){init();data=d;term=q;fillList();},next:function(){moveSelect(1);},prev:function(){moveSelect(-1);},pageUp:function(){if(active!=0&&active-8<0){moveSelect(-active);}else{moveSelect(-8);}},pageDown:function(){if(active!=listItems.size()-1&&active+8>listItems.size()){moveSelect(listItems.size()-1-active);}else{moveSelect(8);}},hide:function(){element&&element.hide();listItems&&listItems.removeClass(CLASSES.ACTIVE);active=-1;},visible:function(){return element&&element.is(":visible");},current:function(){return this.visible()&&(listItems.filter("."+CLASSES.ACTIVE)[0]||options.selectFirst&&listItems[0]);},show:function(){var offset=$(input).offset();element.css({width:typeof options.width=="string"||options.width>0?options.width:$(input).width(),top:offset.top+input.offsetHeight,left:offset.left}).show();if(options.scroll){list.scrollTop(0);list.css({maxHeight:options.scrollHeight,overflow:'auto'});if($.browser.msie&&typeof document.body.style.maxHeight==="undefined"){var listHeight=0;listItems.each(function(){listHeight+=this.offsetHeight;});var scrollbarsVisible=listHeight>options.scrollHeight;list.css('height',scrollbarsVisible?options.scrollHeight:listHeight);if(!scrollbarsVisible){listItems.width(list.width()-parseInt(listItems.css("padding-left"))-parseInt(listItems.css("padding-right")));}}}},selected:function(){var selected=listItems&&listItems.filter("."+CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);return selected&&selected.length&&$.data(selected[0],"ac_data");},emptyList:function(){list&&list.empty();},unbind:function(){element&&element.remove();}};};$.Autocompleter.Selection=function(field,start,end){if(field.createTextRange){var selRange=field.createTextRange();selRange.collapse(true);selRange.moveStart("character",start);selRange.moveEnd("character",end);selRange.select();}else if(field.setSelectionRange){field.setSelectionRange(start,end);}else{if(field.selectionStart){field.selectionStart=start;field.selectionEnd=end;}}field.focus();};})(jQuery);

$(function(){
    var isSearching = false;
    var $searchBox = $("#txtSearch");
    var suggestions = [];
    $searchBox.hover(function(){
        if(suggestions.length < 1){
            $.get("/Client/Resources/SearchSugestions.xml", function(xml){
                $('root > s',xml).each(function(){
                    suggestions.push($(this).text());
                });
                $searchBox.autocomplete(suggestions,{
                    selectFirst: false
                });
            });
        }
    });
    $searchBox.keydown(function(event){
        if (event.keyCode == 13){
            return false;
        }
    });
    // event when a term is entered that is not from the suggestion list
    // - will occur even when a suggestion has been selected,
    // so must check that search is not already occurring
    $searchBox.keyup(function(event){
        if (event.keyCode == 13 && !isSearching){
            performSearch($(this).val());
        }
        return false;
    });
    // event when a suggestion is selected from the list
    // set isSearching to true so perform search will not be called twice
    $searchBox.result(function(event){
        isSearching = true;
        performSearch($(this).val());
    });
    $searchBox.setSearchDefault();
    $("#btnSearch").click(function(){
        performSearch($searchBox.val());
    });
});

this.performSearch = function(searchterm){
    splitterms = searchterm.toLowerCase().split(" ");
    var regexp = new RegExp("[^a-zA-Z0-9_]", "g");
    var term = "";
    var i = 0;
    for(i=0;i<splitterms.length;i++){
        term += splitterms[i] + "_";
    }
    term = term.substring(0,term.length-1);
    term = term.replace(regexp,"");
    if (term != "search_experiences" && term != ""){
        window.location.href = "/Search/" + term;
    }
    else{
        $("#txtSearch").focus();
    }
};

$.fn.setSearchDefault = function() {
    return this.focus(function() {
	    if(this.value == this.defaultValue) {
		    this.value = "";
		    $(this).addClass("active");
	    }
    }).blur(function() {
	    if(!this.value.length) {
		    this.value = this.defaultValue;
		    $(this).removeClass("active");
	    }
    });
};var tb_pathToImage="/Client/Images/loading.gif";$(document).ready(function(){tb_init('a.thickbox, area.thickbox, input.thickbox');imgLoader=new Image();imgLoader.src=tb_pathToImage});function tb_init(b){$(b).click(function(){var t=this.title||this.name||null;var a=this.href||this.alt;var g=this.rel||false;tb_show(t,a,g);this.blur();return false})}function tb_show(d,f,g){try{if(typeof document.body.style.maxHeight==="undefined"){$("body","html").css({height:"100%",width:"100%"});$("html").css("overflow","hidden");if(document.getElementById("TB_HideSelect")===null){$("form").append("<iframe id='TB_HideSelect'></iframe><div id='TB_overlay'></div><div id='TB_window'></div>");$("#TB_overlay").click(tb_remove)}}else{if(document.getElementById("TB_overlay")===null){$("form").append("<div id='TB_overlay'></div><div id='TB_window'></div>");$("#TB_overlay").click(tb_remove)}}if(tb_detectMacXFF()){$("#TB_overlay").addClass("TB_overlayMacFFBGHack")}else{$("#TB_overlay").addClass("TB_overlayBG")}if(d===null){d=""}$("form").append("<div id='TB_load'><img src='"+imgLoader.src+"' /></div>");$('#TB_load').show();var h;if(f.indexOf("?")!==-1){h=f.substr(0,f.indexOf("?"))}else{h=f}var i=/\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/;var j=h.toLowerCase().match(i);if(j=='.jpg'||j=='.jpeg'||j=='.png'||j=='.gif'||j=='.bmp'){TB_PrevCaption="";TB_PrevURL="";TB_PrevHTML="";TB_NextCaption="";TB_NextURL="";TB_NextHTML="";TB_imageCount="";TB_FoundURL=false;if(g){TB_TempArray=$("a[@rel="+g+"]").get();for(TB_Counter=0;((TB_Counter<TB_TempArray.length)&&(TB_NextHTML===""));TB_Counter++){var k=TB_TempArray[TB_Counter].href.toLowerCase().match(i);if(!(TB_TempArray[TB_Counter].href==f)){if(TB_FoundURL){TB_NextCaption=TB_TempArray[TB_Counter].title;TB_NextURL=TB_TempArray[TB_Counter].href;TB_NextHTML="<span id='TB_next'>&nbsp;&nbsp;<a href='#'>Next &gt;</a></span>"}else{TB_PrevCaption=TB_TempArray[TB_Counter].title;TB_PrevURL=TB_TempArray[TB_Counter].href;TB_PrevHTML="<span id='TB_prev'>&nbsp;&nbsp;<a href='#'>&lt; Prev</a></span>"}}else{TB_FoundURL=true;TB_imageCount="Image "+(TB_Counter+1)+" of "+(TB_TempArray.length)}}}imgPreloader=new Image();imgPreloader.onload=function(){imgPreloader.onload=null;var a=tb_getPageSize();var x=a[0]-150;var y=a[1]-150;var b=imgPreloader.width;var c=imgPreloader.height;if(b>x){c=c*(x/b);b=x;if(c>y){b=b*(y/c);c=y}}else if(c>y){b=b*(y/c);c=y;if(b>x){c=c*(x/b);b=x}}TB_WIDTH=b+30;TB_HEIGHT=c+60;$("#TB_window").append("<a href='' id='TB_ImageOff' title='Close'><img id='TB_Image' src='"+f+"' width='"+b+"' height='"+c+"' alt='"+d+"'/></a>"+"<div id='TB_caption'>"+d+"<div id='TB_secondLine'>"+TB_imageCount+TB_PrevHTML+TB_NextHTML+"</div></div><div id='TB_closeWindow'><a href='#' id='TB_closeWindowButton' title='Close'>close</a> or Esc Key</div>");$("#TB_closeWindowButton").click(tb_remove);if(!(TB_PrevHTML==="")){function goPrev(){if($(document).unbind("click",goPrev)){$(document).unbind("click",goPrev)}$("#TB_window").remove();$("form").append("<div id='TB_window'></div>");tb_show(TB_PrevCaption,TB_PrevURL,g);return false}$("#TB_prev").click(goPrev)}if(!(TB_NextHTML==="")){function goNext(){$("#TB_window").remove();$("form").append("<div id='TB_window'></div>");tb_show(TB_NextCaption,TB_NextURL,g);return false}$("#TB_next").click(goNext)}document.onkeydown=function(e){if(e==null){keycode=event.keyCode}else{keycode=e.which}if(keycode==27){tb_remove()}else if(keycode==190){if(!(TB_NextHTML=="")){document.onkeydown="";goNext()}}else if(keycode==188){if(!(TB_PrevHTML=="")){document.onkeydown="";goPrev()}}};tb_position();$("#TB_load").remove();$("#TB_ImageOff").click(tb_remove);$("#TB_window").css({display:"block"})};imgPreloader.src=f}else{var l=f.replace(/^[^\?]+\??/,'');var m=tb_parseQuery(l);TB_WIDTH=(m['width']*1)+30||630;TB_HEIGHT=(m['height']*1)+40||440;ajaxContentW=TB_WIDTH-30;ajaxContentH=TB_HEIGHT-45;if(f.indexOf('TB_iframe')!=-1){urlNoQuery=f.split('TB_');$("#TB_iframeContent").remove();if(m['modal']!="true"){$("#TB_window").append("<div id='TB_title'><div id='TB_ajaxWindowTitle'>"+d+"</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton' title='Close'>close</a> or Esc Key</div></div><iframe frameborder='0' hspace='0' src='"+urlNoQuery[0]+"' id='TB_iframeContent' name='TB_iframeContent"+Math.round(Math.random()*1000)+"' onload='tb_showIframe()' style='width:"+(ajaxContentW+29)+"px;height:"+(ajaxContentH+17)+"px;' > </iframe>")}else{$("#TB_overlay").unbind();$("#TB_window").append("<iframe frameborder='0' hspace='0' src='"+urlNoQuery[0]+"' id='TB_iframeContent' name='TB_iframeContent"+Math.round(Math.random()*1000)+"' onload='tb_showIframe()' style='width:"+(ajaxContentW+29)+"px;height:"+(ajaxContentH+17)+"px;'> </iframe>")}}else{if($("#TB_window").css("display")!="block"){if(m['modal']!="true"){$("#TB_window").append("<div id='TB_title'><div id='TB_ajaxWindowTitle'>"+d+"</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton'>close</a> or Esc Key</div></div><div id='TB_ajaxContent' style='width:"+ajaxContentW+"px;height:"+ajaxContentH+"px'></div>")}else{$("#TB_overlay").unbind();$("#TB_window").append("<div id='TB_ajaxContent' class='TB_modal' style='width:"+ajaxContentW+"px;height:"+ajaxContentH+"px;'></div>")}}else{$("#TB_ajaxContent")[0].style.width=ajaxContentW+"px";$("#TB_ajaxContent")[0].style.height=ajaxContentH+"px";$("#TB_ajaxContent")[0].scrollTop=0;$("#TB_ajaxWindowTitle").html(d)}}$("#TB_closeWindowButton").click(tb_remove);if(f.indexOf('TB_inline')!=-1){$("#TB_ajaxContent").append($('#'+m['inlineId']).children());$("#TB_window").unload(function(){$('#'+m['inlineId']).append($("#TB_ajaxContent").children())});tb_position();$("#TB_load").remove();$("#TB_window").css({display:"block"})}else if(f.indexOf('TB_iframe')!=-1){tb_position();if($.browser.safari){$("#TB_load").remove();$("#TB_window").css({display:"block"})}}else{$("#TB_ajaxContent").load(f+="&random="+(new Date().getTime()),function(){tb_position();$("#TB_load").remove();tb_init("#TB_ajaxContent a.thickbox");$("#TB_window").css({display:"block"})})}}if(!m['modal']){document.onkeyup=function(e){if(e==null){keycode=event.keyCode}else{keycode=e.which}if(keycode==27){tb_remove()}}}}catch(e){}}function tb_showIframe(){$("#TB_load").remove();$("#TB_window").css({display:"block"})}function tb_remove(){$("#TB_imageOff").unbind("click");$("#TB_closeWindowButton").unbind("click");$("#TB_window").fadeOut("fast",function(){$('#TB_window,#TB_overlay,#TB_HideSelect').trigger("unload").unbind().remove()});$("#TB_load").remove();if(typeof document.body.style.maxHeight=="undefined"){$("body","html").css({height:"auto",width:"auto"});$("html").css("overflow","")}document.onkeydown="";document.onkeyup="";return false}function tb_position(){$("#TB_window").css({marginLeft:'-'+parseInt((TB_WIDTH/2),10)+'px',width:TB_WIDTH+'px'});if(!(jQuery.browser.msie&&jQuery.browser.version<7)){$("#TB_window").css({marginTop:'-'+parseInt((TB_HEIGHT/2),10)+'px'})}}function tb_parseQuery(a){var b={};if(!a){return b}var c=a.split(/[;&]/);for(var i=0;i<c.length;i++){var d=c[i].split('=');if(!d||d.length!=2){continue}var e=unescape(d[0]);var f=unescape(d[1]);f=f.replace(/\+/g,' ');b[e]=f}return b}function tb_getPageSize(){var a=document.documentElement;var w=window.innerWidth||self.innerWidth||(a&&a.clientWidth)||document.body.clientWidth;var h=window.innerHeight||self.innerHeight||(a&&a.clientHeight)||document.body.clientHeight;arrayPageSize=[w,h];return arrayPageSize}function tb_detectMacXFF(){var a=navigator.userAgent.toLowerCase();if(a.indexOf('mac')!=-1&&a.indexOf('firefox')!=-1){return true}}(function($){$.fn.innerfade=function(a){return this.each(function(){$.innerfade(this,a)})};$.innerfade=function(a,b){var c={'animationtype':'fade','speed':'normal','type':'sequence','timeout':2000,'containerheight':'auto','runningclass':'innerfade','children':null};if(b)$.extend(c,b);if(c.children===null)var d=$(a).children();else var d=$(a).children(c.children);if(d.length>1){$(a).css('position','relative').css('height',c.containerheight).addClass(c.runningclass);for(var i=0;i<d.length;i++){$(d[i]).css('z-index',String(d.length-i)).css('position','absolute').hide()};if(c.type=="sequence"){setTimeout(function(){$.innerfade.next(d,c,1,0)},c.timeout);$(d[0]).show()}else if(c.type=="random"){var e=Math.floor(Math.random()*(d.length));setTimeout(function(){do{f=Math.floor(Math.random()*(d.length))}while(e==f);$.innerfade.next(d,c,f,e)},c.timeout);$(d[e]).show()}else if(c.type=='random_start'){c.type='sequence';var f=Math.floor(Math.random()*(d.length));setTimeout(function(){$.innerfade.next(d,c,(f+1)%d.length,f)},c.timeout);$(d[f]).show()}else{alert('Innerfade-Type must either be \'sequence\', \'random\' or \'random_start\'')}}};$.innerfade.next=function(a,b,c,d){if(b.animationtype=='slide'){$(a[d]).slideUp(b.speed);$(a[c]).slideDown(b.speed)}else if(b.animationtype=='fade'){$(a[d]).fadeOut(b.speed);$(a[c]).fadeIn(b.speed,function(){removeFilter($(this)[0])})}else alert('Innerfade-animationtype must either be \'slide\' or \'fade\'');if(b.type=="sequence"){if((c+1)<a.length){c=c+1;d=c-1}else{c=0;d=a.length-1}}else if(b.type=="random"){d=c;while(c==d)c=Math.floor(Math.random()*a.length)}else alert('Innerfade-Type must either be \'sequence\', \'random\' or \'random_start\'');setTimeout((function(){$.innerfade.next(a,b,c,d)}),b.timeout)}})(jQuery);function removeFilter(a){if(a.style.removeAttribute){a.style.removeAttribute('filter')}}
/* this script will apply validation styling to an existing asp.net form with a css class of "rld-form"
 * and inline client side validation using validation controls with a css class of "validation"
 *
 * To use to form functionality "applyRldForm();" on a page where this script is referenced
 * 
 * For DATE SELECT fields:
 * Use $(txtDateId).datePicker(); 
 * And add "/client/style/plugins/jquery.datePicker.css"
 * and "/client/script/jquery/jquery.datePicker.2.1.2.min.js"
 */


$.fn.rldForm = function(){

    $(this).find("input").addClass("form-input")
        .end().find("select").addClass("form-input")
        .end().find("textarea").addClass("form-input");

    $(this).find(".form-input").blur(function(){
        $(this).parent().removeClass("focus").validateField();
    }).focus(function(){
        $(this).parent().addClass("focus");
    });
    
    $(".validate-field").click(function(){
        return $(this).parent().validateField();
    });
    
    $(".validate-form").click(function(){
        $(".rld-form").validateForm();
    });
    
    // apply form validation style after server validation fails
    if("<%= Page.IsPostBack && !Page.IsValid %>" == "True"){
        $(".rld-form").validateForm();
    }
    
    return $(this);
};

$.fn.validateField = function(){

    // if asp.net has not displayed and invalid msg, but the input is empty
    if($(this).find(".form-input").val() == "" && $(this).find("span.validation").length > 0){
        $(this).find("span.validation:first").show();
    }

    var validationCount = $(this).find("span.validation").length;
    
    var hiddenValidationCount = 0;
    $(this).find("span.validation").each(function(){
        if($(this).css("display") == "none" || $(this).css("visibility") == "hidden")
            hiddenValidationCount ++;
    });
        
    // if asp.net hasn't displayed an invalid msg...
    if(validationCount == hiddenValidationCount)
    {
        $(this).addClass("valid").removeClass("invalid"); 
        return true;      
    }
    else
    {
        $(this).addClass("invalid").removeClass("valid");
        return false;
    }

};

$.fn.validateForm = function(){
    Page_ClientValidate();
    $(this).find(".form-input").parent().each(function(){
        if($(this).find("span.validation:visible").length > 0){
            return $(this).addClass("invalid").removeClass("valid");
        }
    });
};

this.clearValidationStyle = function(){
    $(".rld-form").find(".form-input").parent().each(function(){
        $(this).removeClass("invalid").removeClass("valid").find("span.validation").hide();
    });
};

this.applyRldForm = function(){
    $(".rld-form").rldForm();
};

// max character limit
$.fn.applyMaxCharacterLimit = function(countSeletor, maxCharacters){
    $(countSeletor).html(maxCharacters);
    $(this).keyup(applyTrim);
    $(this).blur(applyTrim);
    function applyTrim(){
        text = $(this).val().replace(new RegExp("\\n", "g"), " ");
        var remaining = maxCharacters - text.length;
        if(remaining >= 0){
            $(countSeletor).html(remaining);
        }
        else{
            $(this).val(text.substring(0, maxCharacters));
        }
    }
    return this;
};

// Can be used to close thickboxes from within an Iframe thick box.
// Must be called from parent like this <a href="javascript:parent.closeThickBox()"> ... </a>;
function closeThickBox(redirect){
    tb_remove();
    if(redirect != "")
        window.location = redirect;
}

// code for MSIE
//if($.browser.msie && $.browser.version.substr(0,1) < 8){
//  take necessary correcting action here.
//}

/* Tip Top Tooltip
 * For use with 'roundbutton-right'. Put tool tip text in anchor title attribute.
 */
 
$(function(){
    $(".roundbutton-right.tooltip").hover(function(e){
            this.t = this.title;
            this.title = "";
            $("#tooltip").remove();
            $("body").append("<div id=\"tooltip\"><div class=\"rld-box\"><div class=\"content\">" + this.t + "</div></div><span class=\"spike\"></span></div>");
            var tooltipLeft = (getLeft(this) + ($(this).width() / 2)) - ($("#tooltip").width() / 2);
            var tooltipTop = getTop(this) - $("#tooltip").height() - 1; //-1 so no overlap with element
            $("#tooltip").css("opacity", "0")
	                     .css("top", tooltipTop + "px")
	                     .css("left", tooltipLeft + "px")
	                     .animate({"top" : "-=5px", "opacity" : "1"}, "fast");
        }, function(){
            removeToolTip(this);
    }).click(function(){
        removeToolTip(this);
    });
});

this.removeToolTip = function(button){
    button.title = button.t;
    $("#tooltip").stop().animate({
        "top" : "-=5px",
        "opacity": "0"}, "fast", function(){
            $(this).remove();
        });
};

function getLeft(obj){
    var curleft = 0;
    if (obj.offsetParent){
        while (1) {
            curleft += obj.offsetLeft;
            if (!obj.offsetParent){
                break;
            }
            obj = obj.offsetParent;
        }
    }
    else if (obj.x){
        curleft += obj.x;
    }
    return curleft;
}

function getTop(obj){
    var curtop = 0;
    if (obj.offsetParent){
        while (1) {
            curtop += obj.offsetTop;
            if (!obj.offsetParent){
                break;
            }
            obj = obj.offsetParent;
        }
    }
    else if (obj.y){
        curtop += obj.y;
    }
    return curtop;
}// get query string param from href
function getParameter(string, name) {
    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regexS = "[\\?&#]" + name + "=([^&#]*)";
    var regex = new RegExp(regexS);
    var results = regex.exec(string);
    if (results === null) {
        return "";
    }
    else {
        return results[1];
    }
}

// get query string param
function getQueryStringParameter(name) {
    return getParameter(window.location.href, name);
}

// get hash string param
function getHashParameter(name) {
    return getParameter(window.location.hash, name);
}

// get href attribute
$.fn.href = function () {
    return this.attr("href");
};

// css = class to add when focus is given
$.fn.emptyOnFocus = function (css) {
    this.focus(function () {
        if (this.value == this.defaultValue) {
            this.value = "";
            if (css) {
                $(this).addClass(css);
            }
        }
    }).blur(function () {
        if (!this.value.length) {
            this.value = this.defaultValue;
            if (css) {
                $(this).removeClass(css);
            } 
        }
    });
    return this;
};

// callback = function to perform with search query
$.fn.onEnterKey = function (callback) {
    this.keyup(function (event) {
        if (event.keyCode == 13) {
            callback(this.value);
        }
    });
    return this;
};

// toggle check box
$.fn.check = function (mode) {
    var mode = mode || "on"; // if mode is undefined, use 'on' as default
    return this.each(function () {
        switch (mode) {
            case "on":
                this.checked = true;
                break;
            case "off":
                this.checked = false;
                break;
            case "toggle":
                this.checked = !this.checked;
                break;
        }
    });
};

// make area clickable - will find first anchor and follow it
$.fn.clickableArea = function (hoverClass) {
    this.mouseenter(function () {
        $(this).css("cursor", "pointer");
        if (hoverClass) {
            $(this).addClass(hoverClass);
        }
    }).mouseleave(function () {
        $(this).css("cursor", "auto");
        if (hoverClass) {
            $(this).removeClass(hoverClass);
        }
    }).click(function (e) {
        window.location.href = $(this).find("a:first").href();
        return false;
    });
};

// give highlight class to item and item anchor
$.fn.selectListItem = function () {
    // get selected class from parent
    var selectedClass = this.parents("ul:first").attr("rld:selectedclass") || "";
    // get element type (so can be used for something other than list item)
    var tag = this.attr("tagName");
    var selectedClass = "selected " + selectedClass;
    // remove selected class from all silbings and child anchors
    this.parent().find("> " + tag).removeClass(selectedClass).find("> a").removeClass(selectedClass);
    // add selected class to item and anchor
    this.addClass(selectedClass).find(" > a").addClass(selectedClass);
    return this;
};

// Can be used to close thickboxes from within an Iframe thick box.
// Must be called from parent like this <a href="javascript:parent.closeThickBox()"> ... </a>;
function closeThickBox(redirect) {
    tb_remove();
    if (redirect != "")
        window.location = redirect;
}

// max character limit
$.fn.applyMaxCharacterLimit = function (countSeletor, maxCharacters) {
    $(countSeletor).html(maxCharacters);
    $(this).keyup(applyTrim);
    $(this).blur(applyTrim);
    function applyTrim() {
        text = $(this).val().replace(new RegExp("\\n", "g"), " ");
        var remaining = maxCharacters - text.length;
        if (remaining >= 0) {
            $(countSeletor).html(remaining);
        }
        else {
            $(this).val(text.substring(0, maxCharacters));
        }
    }
    return this;
};


// product tabs
(function () {

    var _config = {
        navClass: ".tab-nav",
        contentClass: ".tab-content",
        selectedClass: "selected"
    };

    $.fn.productTabs = function () {
        var $this = this;
        // hide all
        $this.productTabsHideAll();
        // show first
        $this.find(_config.navClass + ":first").addClass(_config.selectedClass);
        $this.find(_config.contentClass + ":first").css("display","block");
        // click to show
        $this.find(_config.navClass).find("a").click(function () {
            $this.find(_config.navClass).removeClass(_config.selectedClass);
            $(this).parents(_config.navClass).addClass(_config.selectedClass);
            $this.productTabsHideAll();
            $this.find("#" + $(this).href()).css("display","block");
            return false;
        });

        return $this;
    };

    $.fn.productTabsHideAll = function () {
        this.find(_config.contentClass).css("display","none");
        return this;
    };

    $.fn.productTabsSelect = function (tab) {
        this.productTabsHideAll();
        this.find(tab).css("display","block");
        this.find(_config.navClass).each(function () {
            $(this).removeClass(_config.selectedClass);
            if ($(this).find("a").href() == tab) {
                $(this).addClass(_config.selectedClass);
            }
        });
        return this;
    };

})();


$.fn.columns = function (options) {

    var _options = {
        colCount: 2,
        colWidth: 200,
        colClass: "col",
        selector: "div"
    };

    $.extend(_options, options);

    //move to visible part of document and get reference to parent
    //var $parent = this.parent();
    var $this = this;
    //this.remove();
    //$("body").append($this);

    // set width of item to column width to measure height (reset at end)
    $this.width(_options.colWidth);

    var colHeight = parseInt($this.outerHeight(true) / _options.colCount);
    var items = $this.find(_options.selector);
    var cols = new Array(_options.colCount - 1);

    // create container columns
    for (var c = 0; c < _options.colCount; c++) {
        cols[c] = $("<div class='" + _options.colClass + "'></div>");
    }

    // remove margin from last coloumn
    cols[cols.length - 1] = $(cols[cols.length - 1]).css("margin-right", 0);

    // send items to correct column
    for (var i = 0; i < items.length; i++) {
        var $item = $(items[i]);
        var offset = $item.offset().top - $this.offset().top;
        for (var j = 1; j <= _options.colCount; j++) {
            // append to column if there is room, or always if it is the last column
            if (offset < (colHeight * j) || j == parseInt(_options.colCount)) {
                cols[j - 1] = $(cols[j - 1]).append($item.clone());
                break;
            }
        }
    }

    // reset width and clear contents
    $this.css("width", "auto").empty();

    // append items
    for (var n in cols) {
        $this.append(cols[n]);
    }

    //var $final = $this.clone();
    //$this.remove();
    //$parent.append($final);

    return this;
};

// hero rotation
$.fn.heroRotation = function (options) {

    var _config = $.extend({
        duration: 6000,
        pageAttr: "rld:page",
        pageContainerId: "pages",
        pageSelectedClass: "selected",
        pagePlayClass: "play"
    }, options);

    var _$this = $(this);
    var _$containers = this.find("li");
    var _$pages;
    var _index = 0;
    var _timer;

    function next(duration) {
        _timer = setTimeout(function () {
            var $item = $(_$containers[_index]);
            //            $item.animate({ "marginTop": 1000 }, 500, function () {
            //                $(this).css({ "zIndex": 0, "marginTop": 0 });
            //                _index = _index == _$containers.length - 1 ? 0 : _index + 1;
            //                showPage();
            //                next(_config.duration);
            //            });
            _index = _index == _$containers.length - 1 ? 0 : _index + 1;
            showPage();
            next(_config.duration);
        }, duration);
    }

    function showPage() {
        _$pages.find("a").removeClass(_config.pageSelectedClass);
        $(_$pages.find("a").get(_index + 1)).addClass(_config.pageSelectedClass);
        _$containers.each(function (i) {
            var $item = $(this).css("display", "none");
            if (i > _index) {
                $item.css("zIndex", (_$containers.length - (i - _index)));
            }
            else if (i < _index) {
                $item.css("zIndex", _index - i);
            }
            else {
                $item.css({
                    "zIndex": _$containers.length,
                    "display": "block"
                });
            }
        });
    }

    function constructPages() {
        _$pages = $("<ul id='" + _config.pageContainerId + "'></ul>");
        _$pages.append("<li><a href='#' class='" + _config.pagePlayClass + "' title='Play'>PLAY</a></li>");
        _$containers.each(function (i) {
            _$pages.append("<li><a href='#' " + _config.pageAttr + "='" + i + "'>" + (i + 1) + "</a></li>");
        });
        _$this.append(_$pages);
        _$pages.find("a").click(function () {
            if ($(this).hasClass(_config.pagePlayClass)) {
                $(this).css("display", "none");
                next(100);
            }
            else {
                _$pages.find("." + _config.pagePlayClass).css("display", "block");
                clearTimeout(_timer);
                _index = parseInt($(this).attr(_config.pageAttr));
                showPage();
            }
            return false;
        });
    }

    if (_$containers.length > 1) {
        constructPages();
        showPage();
        next(_config.duration);
    }

    return this;
};

// product images
$.fn.imageStack = function () {

    var _config = {
        containerClass: ".container",
        hoverClass: "hover"
    };

    var _$containers;

    function arrangeIndexes() {
        _$containers.each(function (index) {
            $(this).css("zIndex", _$containers.length - parseInt(index));
        });
    }

    function shiftUp() {
        // loop through each container
        _$containers.each(function () {
            // get z-index of container
            var z = parseInt($(this).css("zIndex"));
            // if at top send to bottom
            if (z >= _$containers.length) {
                $(this).css("zIndex", "1");
            }
            // if not shift up
            else {
                $(this).css("zIndex", z + 1);
            }
        });
    }

    // get containers
    _$containers = this.find(_config.containerClass);
    // prime indexes ready for click
    arrangeIndexes();
    // click event
    this.click(function () {
        shiftUp();
    }).hover(function () {
        $(this).addClass(_config.hoverClass);
    }, function () {
        $(this).removeClass(_config.hoverClass);
    });

    return this;
};

// horizontal nav
$.fn.horiNav = function () {
    var _config = {
        itemSelector: ".head",
        hoverClass: "hover",
        navigationKeyCodes: { up: 38, down: 40, enter: 13 }
    };
    this.find(_config.itemSelector).hover(function () {
        $(this).siblings().removeClass(_config.hoverClass);
        $(this).addClass(_config.hoverClass);
    }, function () {
        $(this).removeClass(_config.hoverClass);
    }).focus(function () {
        var index = 0;
        var $links = $($(this).find("a"));
        $(this).siblings().removeClass(_config.hoverClass);
        $(this).addClass(_config.hoverClass).keydown(function (e) {
            switch (parseInt(e.keyCode)) {
                case _config.navigationKeyCodes.down:
                case _config.navigationKeyCodes.up:
                    // prevent scrolling when there is a drop down
                    return parseInt($links.length) <= 1;
                    break;
                default:
                    return true;
                    break;
            }
        }).keyup(function (e) {
            switch (parseInt(e.keyCode)) {
                case _config.navigationKeyCodes.down:
                    if (index < $links.length - 1) {
                        index++;
                        var $a = $($links.get(index));
                        $links.removeClass(_config.hoverClass);
                        $a.addClass(_config.hoverClass);
                        if ($a.is(":hidden")) {
                            $.scrollTo($a);
                        }
                    }
                    break;
                case _config.navigationKeyCodes.up:
                    if (index > 0) {
                        index--;
                        $links.removeClass(_config.hoverClass);
                        $($links.get(index)).addClass(_config.hoverClass);
                    }
                    break;
                case _config.navigationKeyCodes.enter:
                    window.location = $($links.get(index)).href();
                    break;
            }
            return false;
        });
    }).blur(function () {
        $(this).unbind("keydown").unbind("keyup");
        $(this).removeClass(_config.hoverClass);
        $(this).find("a").removeClass(_config.hoverClass);
    });

    return this;
};

// recenrly viewed products
$.fn.viewedProducts = function () {
    var $this = this;
    var _config = {
        titleSelector: "#viewed-product-title",
        recommendedListSelector: "#recommended-list",
        recommendedTitleSelector: "#recommended-title",
        viewedListSelector: "#viewed-list",
        viewedTitleSelector: "#viewed-title",
        hoverClass: "hover"
    };

    $this.find(_config.viewedListSelector).find("li").hover(function () {
        $this.find(_config.titleSelector).css("float", "left").html($(this).attr("title"));
        $this.find(_config.recommendedTitleSelector).css("display", "none");
        $this.find(_config.viewedTitleSelector).css("display", "block");
        $(this).addClass(_config.hoverClass);
    }, function () {
        $this.find(_config.titleSelector).empty();
        $(this).removeClass(_config.hoverClass);
        $this.find(_config.recommendedTitleSelector).css("display", "block");
    });

    $this.find(_config.recommendedListSelector).find("li").hover(function () {
        $this.find(_config.titleSelector).css("float", "right").html($(this).attr("title"));
        $this.find(_config.recommendedTitleSelector).css("display", "block");
        $this.find(_config.viewedTitleSelector).css("display", "none");
        $(this).addClass(_config.hoverClass);
    }, function () {
        $this.find(_config.titleSelector).empty();
        $(this).removeClass(_config.hoverClass);
        $this.find(_config.viewedTitleSelector).css("display", "block");
    });

    $this.find(_config.viewedListSelector).find("li:last img").css("margin", 0);
    $this.find(_config.recommendedListSelector).find("li:first img").css("margin", 0);

    return this;
};

// Global on document ready load
$(function () {
    $(".title, .area").each(function () {
        if (!$(this).parent().hasClass("area-wrap")) {
            $(this).wrap("<div class='area-wrap mb-20'></div>");
        }
    });

    $(".button").each(function () {
        if (!$(this).parent().hasClass("area-wrap")) {
            $(this).removeClass("right").wrap("<div class='area-wrap right'></div>");
        }
    });
});
/**
 * jQuery.ScrollTo - Easy element scrolling using jQuery.
 * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
 * Dual licensed under MIT and GPL.
 * Date: 9/11/2008
 * @author Ariel Flesler
 * @version 1.4
 *
 * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
 */
;(function(h){var m=h.scrollTo=function(b,c,g){h(window).scrollTo(b,c,g)};m.defaults={axis:'y',duration:1};m.window=function(b){return h(window).scrollable()};h.fn.scrollable=function(){return this.map(function(){var b=this.parentWindow||this.defaultView,c=this.nodeName=='#document'?b.frameElement||b:this,g=c.contentDocument||(c.contentWindow||c).document,i=c.setInterval;return c.nodeName=='IFRAME'||i&&h.browser.safari?g.body:i?g.documentElement:this})};h.fn.scrollTo=function(r,j,a){if(typeof j=='object'){a=j;j=0}if(typeof a=='function')a={onAfter:a};a=h.extend({},m.defaults,a);j=j||a.speed||a.duration;a.queue=a.queue&&a.axis.length>1;if(a.queue)j/=2;a.offset=n(a.offset);a.over=n(a.over);return this.scrollable().each(function(){var k=this,o=h(k),d=r,l,e={},p=o.is('html,body');switch(typeof d){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(d)){d=n(d);break}d=h(d,this);case'object':if(d.is||d.style)l=(d=h(d)).offset()}h.each(a.axis.split(''),function(b,c){var g=c=='x'?'Left':'Top',i=g.toLowerCase(),f='scroll'+g,s=k[f],t=c=='x'?'Width':'Height',v=t.toLowerCase();if(l){e[f]=l[i]+(p?0:s-o.offset()[i]);if(a.margin){e[f]-=parseInt(d.css('margin'+g))||0;e[f]-=parseInt(d.css('border'+g+'Width'))||0}e[f]+=a.offset[i]||0;if(a.over[i])e[f]+=d[v]()*a.over[i]}else e[f]=d[i];if(/^\d+$/.test(e[f]))e[f]=e[f]<=0?0:Math.min(e[f],u(t));if(!b&&a.queue){if(s!=e[f])q(a.onAfterFirst);delete e[f]}});q(a.onAfter);function q(b){o.animate(e,j,a.easing,b&&function(){b.call(this,r,a)})};function u(b){var c='scroll'+b,g=k.ownerDocument;return p?Math.max(g.documentElement[c],g.body[c]):k[c]}}).end()};function n(b){return typeof b=='object'?b:{top:b,left:b}}})(jQuery);var TrackBasket=function(){};var TrackCustParam=function(){this.lc=0;};var saleTrack=new TrackBasket(),customTrack=new TrackCustParam(),__pxi=new Image(1,1),__ofsi=[],__ofcp=[],__ofcs=[],__ofsr=[],__ofpv=[],__ofic,__prt;TrackBasket.prototype.addSaleItem=function($ic,$iv,$m1,$m2,$m3,$m4){var $t=[];$t[0]=$ic;$t[1]=$iv;$t[2]=($m1===undefined)?"":$m1;$t[3]=($m2===undefined)?"":$m2;$t[4]=($m3===undefined)?"":$m3;$t[5]=($m4===undefined)?"":$m4;__ofsi.push($t);};TrackBasket.prototype.logSale=function($i){__ofic=$i;};TrackCustParam.prototype.logCustomParameter=function(){};TrackCustParam.prototype.addCustomParameter=function($k,$v){var $t=[];$t[0]=$k;$t[1]=$v;$t[2]='';__ofcp.push($t);};TrackCustParam.prototype.logStoredParameters=function($type){var $i;this.lc+=1;if($type===undefined){$type='iqpage';}if($type.toLowerCase().indexOf("iq")!==0){$type="iq"+$type;}for($i=0;$i<__ofcp.length;$i++){if(__ofcp[$i][2]===''){__ofcp[$i][2]=$type;__ofcp[$i][3]=this.lc;}}};function rdr($r,$n){if($r!==undefined){if($r.href!==undefined){$r.href=$r;}else{if($n===undefined){$n="";}if($n.toLowerCase()==='true'){window.open($r);}else{self.location=$r;}}}}
function logOCSale($p,$r,$n){var $t=[];$t[0]=$p;$t[1]=$r;$t[2]=$n;__ofcs.push($t);rdr($r,$n);}
function logOCSearch($s,$p,$d){var $t=[];$t[0]=$s;$t[1]=$p;$t[2]=$d;__ofsr.push($t);}
function logOCPV($p,$r,$n){var $t=[];$t[0]=$p;$t[1]=$r;$t[2]=$n;__ofpv.push($t);rdr($r,$n);}
function genProc($arg){}
function getCkVal(cn){return(document.cookie.indexOf(cn)===-1)?'':document.cookie.substring(document.cookie.indexOf(cn),(document.cookie+';').indexOf(';',document.cookie.indexOf(cn)));}var _stdbg={ckn:'_#stdbg',rc:"",chkLog:function(){var loc=document.location.search.replace("?","");if(loc===""){return;}var pars=loc.split("&"),par=0,qsp=[];for(par=0;par<pars.length;par++){if(pars[par].substring(0,3)==="_st"){qsp.push(pars[par]);}}if(qsp.length>0){var di=0,cc=decodeURIComponent(getCkVal(this.ckn).replace(this.ckn+"=",""));if(cc.length===0){this.rc=qsp.join("&");}else{var cps=cc.split("&"),nps=[];for(par=0;par<cps.length;par++){var ckv=cps[par].split("=");for(di=0;di<qsp.length;di++){var qkv=qsp[di].split("=");if(ckv[0]===qkv[0]){ckv[1]=qkv[1];qsp[di]="";break;}}nps.push(ckv[0]+"="+ckv[1]);}this.rc=nps.join("&")+"&"+qsp.join("&");this.rc.replace("&&","&");if(this.rc.substring(this.rc.length-1)==="&"){this.rc=this.rc.substring(0,this.rc.length-1);}}var dt=new Date();dt.setHours(dt.getHours()+25);var ck=this.ckn+'='+encodeURIComponent(this.rc)+'; expires='+dt.toGMTString();document.cookie=ck;}},isDbg:function(dbg){if(this.rc===""){this.rc=decodeURIComponent(getCkVal(this.ckn).replace(this.ckn+"=",""));}if(this.rc===""){return false;}var pars=this.rc.split("&"),par=0;for(par=0;par<pars.length;par++){var kv=pars[par].split("=");if(kv.length===2&&kv[0].toUpperCase()===dbg.toUpperCase()){return kv[1]==="1";}}return false;}};function setLC(){var dt=new Date();dt.setMinutes(dt.getMinutes()+20);var ck='_#lc=#; expires='+dt.toGMTString();document.cookie=ck;}
function stormInst(nu){_stdbg.chkLog();if(!nu){setLC();}if(_stdbg.isDbg("_stcoredbg")){var p=__stormJs.split("/");p[p.length-1]="q."+p[p.length-1];__stormJs=p.join("/");}__stormJs=__stormJs.replace('https://','').replace('http://','');__stormJs=__prt+__stormJs;var scr=document.createElement('script');scr.setAttribute('type','text/javascript');scr.setAttribute('src',__stormJs);document.getElementsByTagName('head')[0].appendChild(scr);}__prt=(("https:"===document.location.protocol)?"https://":"http://");if(typeof(__stormJs)!=='undefined'){try{if(getCkVal('_#lc')===''){var $px=(__stormJs.replace('https://','').replace('http://','')).split('/')[0];__pxi.onload=stormInst;__pxi.src=__prt+$px+"/px.gif";}else{stormInst(true);}}catch(e){}}
function popupPromo( fileName, wheight, wwidth )
{
	try
	{
		holdwin = window.open(fileName,"Promo",'toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=1,resizable=0,width=' + wwidth + ',height=' + wheight + '');
		if (window.focus) setTimeout('holdwin.focus()',500);

	}
	catch(e)
	{
		window.alert("The Red Letter Days web site would like to open a pop up window. To enable this please add www.redletterdays.co.uk to your pop up manager " + e.description);
	}

}

function popupPoints( fileName )
{
	try
	{
		holdwin = window.open(fileName,"Promo","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=0,width=400,height=600");
		if (window.focus) setTimeout('holdwin.focus()',500);

	}
	catch(e)
	{
		window.alert("The Red Letter Days web site would like to open a pop up window. To enable this please add www.redletterdays.co.uk to your pop up manager " + e.description);
	}

}/*! SWFObject v2.1 <http://code.google.com/p/swfobject/>
	Copyright (c) 2007-2008 Geoff Stearns, Michael Williams, and Bobby van der Sluis
	This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
*/

var swfobject = function() {
	
	var UNDEF = "undefined",
		OBJECT = "object",
		SHOCKWAVE_FLASH = "Shockwave Flash",
		SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
		FLASH_MIME_TYPE = "application/x-shockwave-flash",
		EXPRESS_INSTALL_ID = "SWFObjectExprInst",
		
		win = window,
		doc = document,
		nav = navigator,
		
		domLoadFnArr = [],
		regObjArr = [],
		objIdArr = [],
		listenersArr = [],
		script,
		timer = null,
		storedAltContent = null,
		storedAltContentId = null,
		isDomLoaded = false,
		isExpressInstallActive = false;
	
	/* Centralized function for browser feature detection
		- Proprietary feature detection (conditional compiling) is used to detect Internet Explorer's features
		- User agent string detection is only used when no alternative is possible
		- Is executed directly for optimal performance
	*/	
	var ua = function() {
		var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
			playerVersion = [0,0,0],
			d = null;
		if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
			d = nav.plugins[SHOCKWAVE_FLASH].description;
			if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
				d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
				playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
				playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
				playerVersion[2] = /r/.test(d) ? parseInt(d.replace(/^.*r(.*)$/, "$1"), 10) : 0;
			}
		}
		else if (typeof win.ActiveXObject != UNDEF) {
			var a = null, fp6Crash = false;
			try {
				a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".7");
			}
			catch(e) {
				try { 
					a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".6");
					playerVersion = [6,0,21];
					a.AllowScriptAccess = "always";	 // Introduced in fp6.0.47
				}
				catch(e) {
					if (playerVersion[0] == 6) {
						fp6Crash = true;
					}
				}
				if (!fp6Crash) {
					try {
						a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
					}
					catch(e) {}
				}
			}
			if (!fp6Crash && a) { // a will return null when ActiveX is disabled
				try {
					d = a.GetVariable("$version");	// Will crash fp6.0.21/23/29
					if (d) {
						d = d.split(" ")[1].split(",");
						playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
					}
				}
				catch(e) {}
			}
		}
		var u = nav.userAgent.toLowerCase(),
			p = nav.platform.toLowerCase(),
			webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
			ie = false,
			windows = p ? /win/.test(p) : /win/.test(u),
			mac = p ? /mac/.test(p) : /mac/.test(u);
		/*@cc_on
			ie = true;
			@if (@_win32)
				windows = true;
			@elif (@_mac)
				mac = true;
			@end
		@*/
		return { w3cdom:w3cdom, pv:playerVersion, webkit:webkit, ie:ie, win:windows, mac:mac };
	}();

	/* Cross-browser onDomLoad
		- Based on Dean Edwards' solution: http://dean.edwards.name/weblog/2006/06/again/
		- Will fire an event as soon as the DOM of a page is loaded (supported by Gecko based browsers - like Firefox -, IE, Opera9+, Safari)
	*/ 
	var onDomLoad = function() {
		if (!ua.w3cdom) {
			return;
		}
		addDomLoadEvent(main);
		if (ua.ie && ua.win) {
			try {	 // Avoid a possible Operation Aborted error
				doc.write("<scr" + "ipt id=__ie_ondomload defer=true src=//:></scr" + "ipt>"); // String is split into pieces to avoid Norton AV to add code that can cause errors 
				script = getElementById("__ie_ondomload");
				if (script) {
					addListener(script, "onreadystatechange", checkReadyState);
				}
			}
			catch(e) {}
		}
		if (ua.webkit && typeof doc.readyState != UNDEF) {
			timer = setInterval(function() { if (/loaded|complete/.test(doc.readyState)) { callDomLoadFunctions(); }}, 10);
		}
		if (typeof doc.addEventListener != UNDEF) {
			doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, null);
		}
		addLoadEvent(callDomLoadFunctions);
	}();
	
	function checkReadyState() {
		if (script.readyState == "complete") {
			script.parentNode.removeChild(script);
			callDomLoadFunctions();
		}
	}
	
	function callDomLoadFunctions() {
		if (isDomLoaded) {
			return;
		}
		if (ua.ie && ua.win) { // Test if we can really add elements to the DOM; we don't want to fire it too early
			var s = createElement("span");
			try { // Avoid a possible Operation Aborted error
				var t = doc.getElementsByTagName("body")[0].appendChild(s);
				t.parentNode.removeChild(t);
			}
			catch (e) {
				return;
			}
		}
		isDomLoaded = true;
		if (timer) {
			clearInterval(timer);
			timer = null;
		}
		var dl = domLoadFnArr.length;
		for (var i = 0; i < dl; i++) {
			domLoadFnArr[i]();
		}
	}
	
	function addDomLoadEvent(fn) {
		if (isDomLoaded) {
			fn();
		}
		else { 
			domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
		}
	}
	
	/* Cross-browser onload
		- Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
		- Will fire an event as soon as a web page including all of its assets are loaded 
	 */
	function addLoadEvent(fn) {
		if (typeof win.addEventListener != UNDEF) {
			win.addEventListener("load", fn, false);
		}
		else if (typeof doc.addEventListener != UNDEF) {
			doc.addEventListener("load", fn, false);
		}
		else if (typeof win.attachEvent != UNDEF) {
			addListener(win, "onload", fn);
		}
		else if (typeof win.onload == "function") {
			var fnOld = win.onload;
			win.onload = function() {
				fnOld();
				fn();
			};
		}
		else {
			win.onload = fn;
		}
	}
	
	/* Main function
		- Will preferably execute onDomLoad, otherwise onload (as a fallback)
	*/
	function main() { // Static publishing only
		var rl = regObjArr.length;
		for (var i = 0; i < rl; i++) { // For each registered object element
			var id = regObjArr[i].id;
			if (ua.pv[0] > 0) {
				var obj = getElementById(id);
				if (obj) {
					regObjArr[i].width = obj.getAttribute("width") ? obj.getAttribute("width") : "0";
					regObjArr[i].height = obj.getAttribute("height") ? obj.getAttribute("height") : "0";
					if (hasPlayerVersion(regObjArr[i].swfVersion)) { // Flash plug-in version >= Flash content version: Houston, we have a match!
						if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements
							fixParams(obj);
						}
						setVisibility(id, true);
					}
					else if (regObjArr[i].expressInstall && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) { // Show the Adobe Express Install dialog if set by the web page author and if supported (fp6.0.65+ on Win/Mac OS only)
						showExpressInstall(regObjArr[i]);
					}
					else { // Flash plug-in and Flash content version mismatch: display alternative content instead of Flash content
						displayAltContent(obj);
					}
				}
			}
			else {	// If no fp is installed, we let the object element do its job (show alternative content)
				setVisibility(id, true);
			}
		}
	}
	
	/* Fix nested param elements, which are ignored by older webkit engines
		- This includes Safari up to and including version 1.2.2 on Mac OS 10.3
		- Fall back to the proprietary embed element
	*/
	function fixParams(obj) {
		var nestedObj = obj.getElementsByTagName(OBJECT)[0];
		if (nestedObj) {
			var e = createElement("embed"), a = nestedObj.attributes;
			if (a) {
				var al = a.length;
				for (var i = 0; i < al; i++) {
					if (a[i].nodeName == "DATA") {
						e.setAttribute("src", a[i].nodeValue);
					}
					else {
						e.setAttribute(a[i].nodeName, a[i].nodeValue);
					}
				}
			}
			var c = nestedObj.childNodes;
			if (c) {
				var cl = c.length;
				for (var j = 0; j < cl; j++) {
					if (c[j].nodeType == 1 && c[j].nodeName == "PARAM") {
						e.setAttribute(c[j].getAttribute("name"), c[j].getAttribute("value"));
					}
				}
			}
			obj.parentNode.replaceChild(e, obj);
		}
	}
	
	/* Show the Adobe Express Install dialog
		- Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
	*/
	function showExpressInstall(regObj) {
		isExpressInstallActive = true;
		var obj = getElementById(regObj.id);
		if (obj) {
			if (regObj.altContentId) {
				var ac = getElementById(regObj.altContentId);
				if (ac) {
					storedAltContent = ac;
					storedAltContentId = regObj.altContentId;
				}
			}
			else {
				storedAltContent = abstractAltContent(obj);
			}
			if (!(/%$/.test(regObj.width)) && parseInt(regObj.width, 10) < 310) {
				regObj.width = "310";
			}
			if (!(/%$/.test(regObj.height)) && parseInt(regObj.height, 10) < 137) {
				regObj.height = "137";
			}
			doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
			var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
				dt = doc.title,
				fv = "MMredirectURL=" + win.location + "&MMplayerType=" + pt + "&MMdoctitle=" + dt,
				replaceId = regObj.id;
			// For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
			// In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
			if (ua.ie && ua.win && obj.readyState != 4) {
				var newObj = createElement("div");
				replaceId += "SWFObjectNew";
				newObj.setAttribute("id", replaceId);
				obj.parentNode.insertBefore(newObj, obj); // Insert placeholder div that will be replaced by the object element that loads expressinstall.swf
				obj.style.display = "none";
				var fn = function() {
					obj.parentNode.removeChild(obj);
				};
				addListener(win, "onload", fn);
			}
			createSWF({ data:regObj.expressInstall, id:EXPRESS_INSTALL_ID, width:regObj.width, height:regObj.height }, { flashvars:fv }, replaceId);
		}
	}
	
	/* Functions to abstract and display alternative content
	*/
	function displayAltContent(obj) {
		if (ua.ie && ua.win && obj.readyState != 4) {
			// For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
			// In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
			var el = createElement("div");
			obj.parentNode.insertBefore(el, obj); // Insert placeholder div that will be replaced by the alternative content
			el.parentNode.replaceChild(abstractAltContent(obj), el);
			obj.style.display = "none";
			var fn = function() {
				obj.parentNode.removeChild(obj);
			};
			addListener(win, "onload", fn);
		}
		else {
			obj.parentNode.replaceChild(abstractAltContent(obj), obj);
		}
	} 

	function abstractAltContent(obj) {
		var ac = createElement("div");
		if (ua.win && ua.ie) {
			ac.innerHTML = obj.innerHTML;
		}
		else {
			var nestedObj = obj.getElementsByTagName(OBJECT)[0];
			if (nestedObj) {
				var c = nestedObj.childNodes;
				if (c) {
					var cl = c.length;
					for (var i = 0; i < cl; i++) {
						if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
							ac.appendChild(c[i].cloneNode(true));
						}
					}
				}
			}
		}
		return ac;
	}
	
	/* Cross-browser dynamic SWF creation
	*/
	function createSWF(attObj, parObj, id) {
		var r, el = getElementById(id);
		if (el) {
			if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
				attObj.id = id;
			}
			if (ua.ie && ua.win) { // IE, the object element and W3C DOM methods do not combine: fall back to outerHTML
				var att = "";
				for (var i in attObj) {
					if (attObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries, like Object.prototype.toJSONString = function() {}
						if (i.toLowerCase() == "data") {
							parObj.movie = attObj[i];
						}
						else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
							att += ' class="' + attObj[i] + '"';
						}
						else if (i.toLowerCase() != "classid") {
							att += ' ' + i + '="' + attObj[i] + '"';
						}
					}
				}
				var par = "";
				for (var j in parObj) {
					if (parObj[j] != Object.prototype[j]) { // Filter out prototype additions from other potential libraries
						par += '<param name="' + j + '" value="' + parObj[j] + '" />';
					}
				}
				el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
				objIdArr[objIdArr.length] = attObj.id; // Stored to fix object 'leaks' on unload (dynamic publishing only)
				r = getElementById(attObj.id);	
			}
			else if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements: fall back to the proprietary embed element
				var e = createElement("embed");
				e.setAttribute("type", FLASH_MIME_TYPE);
				for (var k in attObj) {
					if (attObj[k] != Object.prototype[k]) { // Filter out prototype additions from other potential libraries
						if (k.toLowerCase() == "data") {
							e.setAttribute("src", attObj[k]);
						}
						else if (k.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
							e.setAttribute("class", attObj[k]);
						}
						else if (k.toLowerCase() != "classid") { // Filter out IE specific attribute
							e.setAttribute(k, attObj[k]);
						}
					}
				}
				for (var l in parObj) {
					if (parObj[l] != Object.prototype[l]) { // Filter out prototype additions from other potential libraries
						if (l.toLowerCase() != "movie") { // Filter out IE specific param element
							e.setAttribute(l, parObj[l]);
						}
					}
				}
				el.parentNode.replaceChild(e, el);
				r = e;
			}
			else { // Well-behaving browsers
				var o = createElement(OBJECT);
				o.setAttribute("type", FLASH_MIME_TYPE);
				for (var m in attObj) {
					if (attObj[m] != Object.prototype[m]) { // Filter out prototype additions from other potential libraries
						if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
							o.setAttribute("class", attObj[m]);
						}
						else if (m.toLowerCase() != "classid") { // Filter out IE specific attribute
							o.setAttribute(m, attObj[m]);
						}
					}
				}
				for (var n in parObj) {
					if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // Filter out prototype additions from other potential libraries and IE specific param element
						createObjParam(o, n, parObj[n]);
					}
				}
				el.parentNode.replaceChild(o, el);
				r = o;
			}
		}
		return r;
	}
	
	function createObjParam(el, pName, pValue) {
		var p = createElement("param");
		p.setAttribute("name", pName);	
		p.setAttribute("value", pValue);
		el.appendChild(p);
	}
	
	/* Cross-browser SWF removal
		- Especially needed to safely and completely remove a SWF in Internet Explorer
	*/
	function removeSWF(id) {
		var obj = getElementById(id);
		if (obj && (obj.nodeName == "OBJECT" || obj.nodeName == "EMBED")) {
			if (ua.ie && ua.win) {
				if (obj.readyState == 4) {
					removeObjectInIE(id);
				}
				else {
					win.attachEvent("onload", function() {
						removeObjectInIE(id);
					});
				}
			}
			else {
				obj.parentNode.removeChild(obj);
			}
		}
	}
	
	function removeObjectInIE(id) {
		var obj = getElementById(id);
		if (obj) {
			for (var i in obj) {
				if (typeof obj[i] == "function") {
					obj[i] = null;
				}
			}
			obj.parentNode.removeChild(obj);
		}
	}
	
	/* Functions to optimize JavaScript compression
	*/
	function getElementById(id) {
		var el = null;
		try {
			el = doc.getElementById(id);
		}
		catch (e) {}
		return el;
	}
	
	function createElement(el) {
		return doc.createElement(el);
	}
	
	/* Updated attachEvent function for Internet Explorer
		- Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks
	*/	
	function addListener(target, eventType, fn) {
		target.attachEvent(eventType, fn);
		listenersArr[listenersArr.length] = [target, eventType, fn];
	}
	
	/* Flash Player and SWF content version matching
	*/
	function hasPlayerVersion(rv) {
		var pv = ua.pv, v = rv.split(".");
		v[0] = parseInt(v[0], 10);
		v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
		v[2] = parseInt(v[2], 10) || 0;
		return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
	}
	
	/* Cross-browser dynamic CSS creation
		- Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php
	*/	
	function createCSS(sel, decl) {
		if (ua.ie && ua.mac) {
			return;
		}
		var h = doc.getElementsByTagName("head")[0], s = createElement("style");
		s.setAttribute("type", "text/css");
		s.setAttribute("media", "screen");
		if (!(ua.ie && ua.win) && typeof doc.createTextNode != UNDEF) {
			s.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
		}
		h.appendChild(s);
		if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
			var ls = doc.styleSheets[doc.styleSheets.length - 1];
			if (typeof ls.addRule == OBJECT) {
				ls.addRule(sel, decl);
			}
		}
	}
	
	function setVisibility(id, isVisible) {
		var v = isVisible ? "visible" : "hidden";
		if (isDomLoaded && getElementById(id)) {
			getElementById(id).style.visibility = v;
		}
		else {
			createCSS("#" + id, "visibility:" + v);
		}
	}

	/* Filter to avoid XSS attacks 
	*/
	function urlEncodeIfNecessary(s) {
		var regex = /[\\\"<>\.;]/;
		var hasBadChars = regex.exec(s) != null;
		return hasBadChars ? encodeURIComponent(s) : s;
	}
	
	/* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only)
	*/
	var cleanup = function() {
		if (ua.ie && ua.win) {
			window.attachEvent("onunload", function() {
				// remove listeners to avoid memory leaks
				var ll = listenersArr.length;
				for (var i = 0; i < ll; i++) {
					listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
				}
				// cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect
				var il = objIdArr.length;
				for (var j = 0; j < il; j++) {
					removeSWF(objIdArr[j]);
				}
				// cleanup library's main closures to avoid memory leaks
				for (var k in ua) {
					ua[k] = null;
				}
				ua = null;
				for (var l in swfobject) {
					swfobject[l] = null;
				}
				swfobject = null;
			});
		}
	}();
	
	
	return {
		/* Public API
			- Reference: http://code.google.com/p/swfobject/wiki/SWFObject_2_0_documentation
		*/ 
		registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr) {
			if (!ua.w3cdom || !objectIdStr || !swfVersionStr) {
				return;
			}
			var regObj = {};
			regObj.id = objectIdStr;
			regObj.swfVersion = swfVersionStr;
			regObj.expressInstall = xiSwfUrlStr ? xiSwfUrlStr : false;
			regObjArr[regObjArr.length] = regObj;
			setVisibility(objectIdStr, false);
		},
		
		getObjectById: function(objectIdStr) {
			var r = null;
			if (ua.w3cdom) {
				var o = getElementById(objectIdStr);
				if (o) {
					var n = o.getElementsByTagName(OBJECT)[0];
					if (!n || (n && typeof o.SetVariable != UNDEF)) {
							r = o;
					}
					else if (typeof n.SetVariable != UNDEF) {
						r = n;
					}
				}
			}
			return r;
		},
		
		embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj) {
			if (!ua.w3cdom || !swfUrlStr || !replaceElemIdStr || !widthStr || !heightStr || !swfVersionStr) {
				return;
			}
			widthStr += ""; // Auto-convert to string
			heightStr += "";
			if (hasPlayerVersion(swfVersionStr)) {
				setVisibility(replaceElemIdStr, false);
				var att = {};
				if (attObj && typeof attObj === OBJECT) {
					for (var i in attObj) {
						if (attObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries
							att[i] = attObj[i];
						}
					}
				}
				att.data = swfUrlStr;
				att.width = widthStr;
				att.height = heightStr;
				var par = {}; 
				if (parObj && typeof parObj === OBJECT) {
					for (var j in parObj) {
						if (parObj[j] != Object.prototype[j]) { // Filter out prototype additions from other potential libraries
							par[j] = parObj[j];
						}
					}
				}
				if (flashvarsObj && typeof flashvarsObj === OBJECT) {
					for (var k in flashvarsObj) {
						if (flashvarsObj[k] != Object.prototype[k]) { // Filter out prototype additions from other potential libraries
							if (typeof par.flashvars != UNDEF) {
								par.flashvars += "&" + k + "=" + flashvarsObj[k];
							}
							else {
								par.flashvars = k + "=" + flashvarsObj[k];
							}
						}
					}
				}
				addDomLoadEvent(function() {
					createSWF(att, par, replaceElemIdStr);
					if (att.id == replaceElemIdStr) {
						setVisibility(replaceElemIdStr, true);
					}
				});
			}
			else if (xiSwfUrlStr && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) {
				isExpressInstallActive = true; // deferred execution
				setVisibility(replaceElemIdStr, false);
				addDomLoadEvent(function() {
					var regObj = {};
					regObj.id = regObj.altContentId = replaceElemIdStr;
					regObj.width = widthStr;
					regObj.height = heightStr;
					regObj.expressInstall = xiSwfUrlStr;
					showExpressInstall(regObj);
				});
			}
		},
		
		getFlashPlayerVersion: function() {
			return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
		},
		
		hasFlashPlayerVersion: hasPlayerVersion,
		
		createSWF: function(attObj, parObj, replaceElemIdStr) {
			if (ua.w3cdom) {
				return createSWF(attObj, parObj, replaceElemIdStr);
			}
			else {
				return undefined;
			}
		},
		
		removeSWF: function(objElemIdStr) {
			if (ua.w3cdom) {
				removeSWF(objElemIdStr);
			}
		},
		
		createCSS: function(sel, decl) {
			if (ua.w3cdom) {
				createCSS(sel, decl);
			}
		},
		
		addDomLoadEvent: addDomLoadEvent,
		
		addLoadEvent: addLoadEvent,
		
		getQueryParamValue: function(param) {
			var q = doc.location.search || doc.location.hash;
			if (param == null) {
				return urlEncodeIfNecessary(q);
			}
			if (q) {
				var pairs = q.substring(1).split("&");
				for (var i = 0; i < pairs.length; i++) {
					if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
						return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
					}
				}
			}
			return "";
		},
		
		// For internal usage only
		expressInstallCallback: function() {
			if (isExpressInstallActive && storedAltContent) {
				var obj = getElementById(EXPRESS_INSTALL_ID);
				if (obj) {
					obj.parentNode.replaceChild(storedAltContent, obj);
					if (storedAltContentId) {
						setVisibility(storedAltContentId, true);
						if (ua.ie && ua.win) {
							storedAltContent.style.display = "block";
						}
					}
					storedAltContent = null;
					storedAltContentId = null;
					isExpressInstallActive = false;
				}
			} 
		}
	};
}();

