﻿/** global javascript stylesheet **/
//var debugMode = 'DEBUGv16:';
var debugMode = '';

function reInit_SIFR(){
    $(document).ready(function(){
        setTimeout("SWFReplace();",200);
    });
}

AddEvent(window,'load',InitialisePage,false);

function InitialisePage()
{	/* a hook function for anything that you want to happen on page load */
	debugFunctionTitle='InitialisePage()';debug('entered function');
                HideEmptySpotlights();
	AddEvent(window,'resize',FixHorizontalLayout,false);
}

function FixHorizontalLayout()
{
	debugFunctionTitle='FixHorizontalLayout:';debug('entered function');
	if(!compatible) return false;

	var bodytag = document.getElementById("LEXUS");
	if (bodytag != null && bodytag.className.indexOf('horizontal') > -1 )
	{	var contentDiv = document.getElementById("content");
		var primaryContentDiv = document.getElementById("primary-content");
		var secondaryContentDiv = document.getElementById("secondary-content");
        // IE 6 needs to have 170 SUBTRACTED, whereas every other browser needs 30 ADDING.
        var additionalSpacer = (ieVersion() == 6) ? -170 : 30;
        
        if(contentDiv != null && primaryContentDiv != null && secondaryContentDiv != null)
		{	var contentHeight = primaryContentDiv.offsetHeight + secondaryContentDiv.offsetHeight + additionalSpacer + 'px';

			var msg = "primaryContentDiv.offsetHeight = [" + primaryContentDiv.offsetHeight + "] : ";
			msg += "secondaryContentDiv.offsetHeight = [" + secondaryContentDiv.offsetHeight + "] : ";
			msg += "additionalSpacer = [" + additionalSpacer + "] : ";
			msg += "Total height = [" + contentHeight + "]";
			debug(msg);
            if(parseInt(contentHeight) < 500)
                contentHeight = 500;

			contentDiv.style.height = contentHeight;
		}
		else 
		{	//there's a problem with accessing the divs?
			debug('cannot access one or more of the DIVs (primaryContentDiv, secondaryContentDiv)');
		}
	} else { } 
}

/* Generic Members and Methods that could be used elsewhere */
var compatible = (document.getElementById && document.getElementsByTagName && document.createElement&&!(navigator.userAgent.indexOf('MSIE 5') != -1 && navigator.userAgent.indexOf('Mac') != -1));

/* Toggle the display css attribute of the element with the given id */
function toggle(obj) 
{	var el = document.getElementById(obj);
	if ( el.style.display != 'none' ) {	el.style.display = 'none';}
	else {	el.style.display = '';}
}

function getElementsByClass(searchClass,node,tag) 
{
	debugFunctionTitle='getElementsByClass('+searchClass+','+node+','+tag+')';debug('entered function')
    var classElements = new Array();
	if (node == null) node = document;
	if (tag == null) tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) 
	{	if (pattern.test(els[i].className) ) 
		{	classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

function getRefToDiv(divID,oDoc) 
{
	debugFunctionTitle='getRefToDiv('+divID+',oDoc)';debug('entered function');
    if( document.getElementById ) {	return document.getElementById(divID); }
	if( document.all ) {	return document.all[divID]; }
	if( !oDoc ) { oDoc = document; }
	if( document.layers ) 
	{	if( oDoc.layers[divID] ) { return oDoc.layers[divID]; } 
		else {	//repeatedly run through all child layers
			for( var x = 0, y; !y && x < oDoc.layers.length; x++ ) 
			{	//on success, return that layer, else return nothing
				y = getRefToDiv(divID,oDoc.layers[x].document); }
				return y; }
			}
		return false;
}    

function AddEvent(element,eventType,fn,useCapture)
{
    debugFunctionTitle='AddEvent()';debug('entered function eventType='+eventType);
    if(element.addEventListener){element.addEventListener(eventType,fn,useCapture);return true;}
	else if (element.attachEvent){var r = element.attachEvent('on' + eventType, fn);return r;}
	else{element['on' + eventType] = fn;}
    debug('function complete');
}

//PCD-Deleted-070905
//moved to .cs so we can use a literal for the font value (from the web.config settings)
//function SWFReplace()
//{
//	debugFunctionTitle='SWFReplace()';debug('entered function');
//    var nobelbook = { src: '/Images/nobel-book.swf'};  
//	var nobellight = { src: '/Images/nobel-light.swf'};   
//	sIFR.delayCSS  = true;  
//	sIFR.activate(nobelbook, nobellight);  
//	sIFR.replace(nobellight, { selector: 'h1' ,css: [ '.sIFR-root { text-transform: uppercase; color: #272f27 }' ,'a { text-decoration: none; }' ,'a:link { color: #000000; }' ,'a:hover { color: #CCCCCC; }' ] ,wmode: 'transparent' }); 
//	sIFR.replace(nobelbook, { selector: 'h2' ,css: [ '.sIFR-root { text-transform: uppercase; color: #272f27 }' ,'a { text-decoration: none; }' ,'a:link { color: #000000; }' ,'a:hover { color: #CCCCCC; }' ] ,wmode: 'transparent' });
//}
//\\PCD-Deleted-070905

// following functions are used within Aspnet Form tags specifically with ajax and flash 
var pageready = 0;

function pageAvailable()
{
	debugFunctionTitle='pageAvailable()';debug('entered function');
    if(pageready > 0) {
FixHorizontalLayout();
	return true; }
	else {	return false; }
}

function triggerOnClick(ctrl)
{
	debugFunctionTitle='triggerOnClick()';debug('entered function')
	debug("Looking for control [" + ctrl + "]");    
	var ctrlToClick = findAspnetControl(ctrl);
	if(ctrlToClick != null)
	{	debug("Found control [" + ctrl + "]<br>About to trigger click event");
		ctrlToClick.click();
	}
}

function findAspnetControl(ctrl)
{
	debugFunctionTitle='findAspnetControl('+ctrl+')';debug('entered function');
    // Get the length of the control name we are looking for
	var ctrlLen = ctrl.length;
	// Loop through each element on the current form
	for(i=0; i<document.aspnetForm.elements.length; i++)
	{	var curCtrl = document.aspnetForm.elements[i];    // Get the current control
		var curCtrlName = curCtrl.name;                   // Get the control name       
		var curCtrlLen = curCtrlName.length;              // Get the length of the current control  

		// control name that we are looking for.
		if(ctrlLen > curCtrlLen){continue;} // We can eliminate those controls whos names are shorter than the 

		var curCtrlHTMLName = curCtrlName.substring(curCtrlLen - ctrlLen, curCtrlLen);
		var msg = "Current ctrl [" + curCtrlName + "] : Looking for [" + ctrl + "] : Found [" + curCtrlHTMLName + "] : ";
		debug(msg);

		// Finally - compare!
		if(ctrl == curCtrlHTMLName)
		{	debug("Match!");
			return curCtrl;
		}
 	}
	return null; 
}

// Resolves movie using supplied id
function thisMovie(movieName) 
{
    debugFunctionTitle='thisMovie('+movieName+')';debug('entered function');
	if (navigator.appName.indexOf("Microsoft") != -1) {return window[movieName]}
	else {	return document[movieName] }
}

// Standard interface for JavaScript calls on Flash
function flashInterface(jObj, movieName)
{
	debugFunctionTitle='flashInterface';debug('entered function');
	debug('typeof(jObj): ' + typeof(jObj) + ' : movieName: ' + movieName);
	var movie = thisMovie(movieName);
	//var msg = "thisMovie(movieName) " + (movie != null ? "!=" : "==") + " null";debug(msg);
//	try	
//	{
	if (movie != null) {thisMovie(movieName).flashInterface(jObj); }
//	}
//	catch(err)
//	{	// if we trigger a catch here then the swf doesn't poll for the movie etc.
		//txt="There was an error on this page.\n\nError description: " + err.description + "\n\n";if (movie == null) {txt+="Probable cause: the SWF element (" + movieName + ") could not be located.\n\n";}debug(txt);
//	}
}

// Standard interface for Flash calls on JavaScript
function javascriptInterface(jObj)
{
	debugFunctionTitle='javascriptInterface:';debug('entered function');
	debug("command: " + jObj.command + " : parameters: " + jObj.params + " : analytics: " + jObj.analytics);

	var analytics = jObj.analytics;
	if (typeof(analytics) == 'object')
	{	if (jObj.analytics.length>0) 
		{	if (jObj.analytics[0] != 'undefined' && jObj.analytics[0] != 'null' )
			{	debug("calling analytics dcsTrk("+jObj.analytics[0]+", "+jObj.analytics[1]+", "+jObj.analytics[2]+");");
				dcsTrk(jObj.analytics[0], jObj.analytics[1], jObj.analytics[2]);
			}
			else
			{	debug("analytics not called jObj.analytics[0]="+jObj.analytics[0]);
			}
		}
		else
		{	debug('analytics is an object but has no values');
		}
	}

	switch(jObj.command)
	{	case "page_available":
		debug('page_available: returning true');
		pageready = 1;
		return true;
		break;

		case "redirect":
		debug('redirect has been fired');
		var url = jObj.params[0];
		if (url != '' && url != undefined)
		{
		  var winType = jObj.params[1];
		  var mode = jObj.params[2];
		  if (mode != '' && mode != undefined && mode != 'null')
		  {
		    if (url.indexOf('?')>0)
		    { url+='&flashvars=movieMode:' + mode;
		    }
		    else
		    {
		      url+='?flashvars=movieMode:' + mode;
		    }
		  }
		  debug('redirect to: ' + url + ' in Window Type: ' + winType);
		  if (winType == 'full')
		  {  openWin.full(url);
		  }
		  else if (winType == 'new')
		  {  var n=window.open(url);
		  }
		  else
		  {  document.location.href=url;
		  }
		}
		else
		{  debug('there was no valid url');
		}
		break;

		case "transition_complete_range":
		debug('transition_complete_range has been fired');
		carSelection(jObj);
		break;
		
		case "launch_flash":
		debug('launch_flash has been fired **DEPRECATED: use redirect with params:url,windowType,mode**');
		var params = jObj.params;	
		if (typeof(params) == 'object')
		{	if (jObj.params.length>0) 
			{	openWin.full(jObj.params[0]+"?flashvars=movieMode:"+jObj.params[1]);
			}
			else
			{	debug('the params (url, movieMode) required for launch_flash have not been provided');
			}
		}
		else
		{	debug('the params (url, movieMode) required for launch_flash have not been provided');
		}
		break;

		case "close_window":
		window.close();
		break;

		case "invoke_analytics":
		debug('invoke_analytics: this is simply a generic command where there is no other action required (analytics should have been called above)');
		//if (jObj.analytics.length>0) {alert('jObj.analytics.length detected');}
		//{ dcsTrk(jObj.analytics[0], jObj.analytics[1], jObj.analytics[2]);}
		break;

		case "transition_started_range":
		debug('transition_started_range: no action set at the moment');
		break;

		case "stop_video":
		debug('stop_video: no action set at the moment');
		break;
        
		case "pause_video":
		debug ('pause_video: no action set at the moment');
		break;

		case "unpause_video":
		debug ('unpause_video: no action set at the moment');
		break;
        
		case "update_history_range":
		debug('update_history_range: no action set at the moment');
		break;
		
		default :
		debug('case '+jObj.command+' not caught: calling javascriptLocalInterface(jObj);');
		javascriptLocalInterface(jObj);
		break;
	}
}

// invokes flashInterface to initiate video playback
function playVideo(movieName)
{
	debugFunctionTitle='playVideo('+movieName+')';debug('entered function');
	var jObj = {"command": "play_video", "return":false, "params":[]};
	if (typeof(flashInterface) == 'function')
	{	flashInterface(jObj, movieName);
	}
	else {	debug('flashInterface not available');
	}
}

// invokes flashInterface to stop video playback
function stopVideo(movieName)
{
	debugFunctionTitle='stopVideo('+movieName+')';debug('entered function');
	var jObj = {"command": "stop_video", "return":false, "params":[]};
	if (typeof(flashInterface) == 'function')
	{	
	    if(typeof(thisMovie("main_movie")) != 'undefined') {
	        if (typeof(thisMovie("main_movie").flashInterface) == 'function') {
                    
	            flashInterface(jObj, movieName);
                        }
	    }
	}
	else {	debug('flashInterface is not available');
	}
}

// invokes flashInterface to update with the media passed in 
function updateMedia(movieName, sMediaUrl, sMediaType)
{ 
	var jObj = {"command": "update_media", "return":false, "params":[sMediaUrl,sMediaType]}; 
	if (typeof(flashInterface) == 'function')
	{	flashInterface(jObj, movieName); 
	} 
	else {	debug('flashInterface is not available'); 
	} 
} 

/** SWFFormFix v1.0.0: SWF ExternalInterface() Form Fix - http://http://www.teratechnologies.net/stevekamerman/  SWFFormFix is (c) 2007 Steve Kamerman and is released under the MIT License: http://www.opensource.org/licenses/mit-license.php Project sponsored by Tera Technologies - http://www.teratechnologies.net/ **/
SWFFormFixAuto = function()
{
	debugFunctionTitle='SWFFormFixAuto()';debug('entered function');
	if(navigator.appName.toLowerCase() != "microsoft internet explorer")return true;
	var objects = document.getElementsByTagName("object");
	if(objects.length == 0) return true;
	for(i=0;i<objects.length;i++){
		// here's all the objects on the page, now lets find the flash objects
		if(objects[i].classid == "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"){
			// this is a flash movie, apply the fix
			window[objects[i].id] = objects[i];
			debug('fix applied');
		}
	}
	var out = '';
	debug('returning true');
	return true;
}
SWFFormFix = function(swfname)
{
	debugFunctionTitle='SWFFormFix()';debug('entered function');
	if(navigator.appName.toLowerCase() != "microsoft internet explorer")return false;
	var testnodename = "SWFFormFixTESTER";
	document.write('<div id="'+testnodename+'" onclick="SWFFormFixCallback(this,\''+swfname+'\');return false;" style="display:none">&nbsp;</div>');
	document.getElementById(testnodename).onclick();
}
SWFFormFixCallback = function (obj,swfname)
{
	debugFunctionTitle='SWFFormFixCallback()';debug('entered function');
	var path = document;
	var error = false;
	var testnode = obj;
	while(obj = obj.parentNode){
		if(obj.nodeName.toLowerCase() == "form"){
			if(obj.name != undefined && obj.name != null && obj.name.length > 0){
				path = path.forms[obj.name];
			}else{
				debug("Error: one of your forms does not have a name!");
				error = true;
			}
		}
	}
	testnode.parentNode.removeChild(testnode);
	if(error) return false;
	window[swfname]=path[swfname];
	debug('returning true [fixed '+swfname+']')
	return true;
}

// add Accordion initialiser for pages that contain the Accordion-load script and Accordion DIVs
// requires onload...
//  $(document).ready(function() {
//    Accordion.init();
Accordion = {	init: function()
{
	debugFunctionTitle='Accordion()';debug('entered function ** SHOULD THIS OR swfformfix.js be USED? **')
	active = '#Accordion-1';
	running = 0;
	$('#Accordion-section div div').not(active).hide();
	$('#Accordion-section div h3').click(function(e){
		e.preventDefault();
		var p = $('div', this.parentNode);
		if (running || !p.is(":hidden")) return false;
		running = 2;
		$(active).slideUp('fast', function(){--running;});
		active = '#' + p.slideDown('slow', function(){--running;}).get(0).id;
		return false;
	});
	}
}

openWin = { 
	full: function(s){
	debugFunctionTitle='openWin.full()';debug('entered function s='+s);
	s=s.replace(/\s/g, ''); var n=window.open(s,'LexusPopUp', 'width='+screen.availWidth+',height='+screen.availHeight+',left=1,top=1,location=no,resizable=yes,scrollbars=yes,toolbar=no,status=no,menubar=no');n.focus();},
	half: function(s){
	debugFunctionTitle='openWin.half()';debug('entered function s='+s);
	s=s.replace(/\s/g, ''); var n=window.open(s,'LexusPopUp', 'width='+screen.availWidth/2+',height='+screen.availHeight/2+',left='+screen.availWidth/4+',top='+screen.availHeight/4+',location=no,resizable=yes,scrollbars=yes,toolbar=no,status=no,menubar=no');n.focus();},
	specific: function(s,w,h,sLoc,sResize,sScroll,sTool,sStat,sMenu){
	debugFunctionTitle='openWin.specific()';debug('entered function s='+s+',w'+w+',h'+h+',sLoc'+sLoc+',sResize'+sResize+',sScroll'+sScroll+',sTool'+sTool+',sStat'+sStat+',sMenu'+sMenu);
	if(sLoc!="yes"){sLoc='no';}
	if(sResize!="no"){sResize='yes';}
	if(sScroll!="no"){sScroll='yes';}
	if(sTool!="yes"){sTool='no';}
	if(sStat!="yes"){sStat='no';}
	if(sMenu!="yes"){sMenu='no';}
	s=s.replace(/\s/g, ''); 
	try {iLeft=(screen.availWidth-w)/2; }catch(err){iLeft=1;}
	try {iTop=(screen.availHeight-h)/2; }catch(err){iTop=1;}
	var n=window.open(s,'LexusPopUp', 'width='+w+',height='+h+',left='+screen.availWidth/4+',top='+screen.availHeight/4+',location='+sLoc+',resizable='+sResize+',scrollbars='+sScroll+',toolbar='+sTool+',status='+sStat+',menubar='+sMenu+'');
	n.focus();
	}
}

//Open window - deprecated - now use openWin.full('url');
function openwindowfull(s) 
{
    debugFunctionTitle='openwindowfull()';debug('entered function s='+s+' ** DEPRECATED - see openWin.full() ** ');
    openWin.full(s); 
}

function makeFrame(sSrc, iWidth, iHeight, sAlign, iFrameborder, sScrolling, sFrameID) 
{
    debugFunctionTitle='makeFrame()';debug('entered function sSrc='+sSrc+', iWidth='+iWidth+', iHeight='+iHeight+', sAlign='+sAlign+', iFrameborder='+iFrameborder+', sScrolling='+sScrolling+', sFrameID='+sFrameID);
	if (!document.getElementById(sFrameID + 'ID'))
	{	if (iWidth == -1){iWidth=640};
		if (iHeight == -1){iHeight=480};
		if (sSrc == ''){sSrc='about:no-url-passed'};
		if (sAlign == ''){sAlign='left'};
		if (sScrolling == ''){sScrolling='auto'};
		ifrm = document.createElement("IFRAME");
		ifrm.setAttribute("id", sFrameID + 'ID');
		ifrm.setAttribute("Name", window.location.host);
		ifrm.setAttribute("src", sSrc);
		ifrm.setAttribute("align", sAlign);
		ifrm.setAttribute("frameborder", iFrameborder);
		ifrm.setAttribute("scrolling", sScrolling);
		ifrm.style.width = iWidth +"px";
		ifrm.style.height = iHeight +"px";
		ifrm.style.backgroundColor = "#ffffff";

		document.getElementById(sFrameID).appendChild(ifrm);
	}
}


function makeFrameBg(sSrc, iWidth, iHeight, sAlign, iFrameborder, sScrolling, sFrameID, bgColor) 
{
    debugFunctionTitle='makeFrame()';debug('entered function sSrc='+sSrc+', iWidth='+iWidth+', iHeight='+iHeight+', sAlign='+sAlign+', iFrameborder='+iFrameborder+', sScrolling='+sScrolling+', sFrameID='+sFrameID);
	if (!document.getElementById(sFrameID + 'ID'))
	{	

                                var setTransparent = 'false'
                                if (iWidth == -1){iWidth=640};
		if (iHeight == -1){iHeight=480};
		if (sSrc == ''){sSrc='about:no-url-passed'};
		if (sAlign == ''){sAlign='left'};
		if (sScrolling == ''){sScrolling='auto'};
                                if (bgColor.toLowerCase == 'transparent'){setTransparent ='true'};
		ifrm = document.createElement("IFRAME");
		ifrm.setAttribute("id", sFrameID + 'ID');
		ifrm.setAttribute("Name", window.location.host);
		ifrm.setAttribute("src", sSrc);
		ifrm.setAttribute("align", sAlign);
		ifrm.setAttribute("frameborder", iFrameborder);
		ifrm.setAttribute("scrolling", sScrolling);
                                ifrm.setAttribute("allowTransparency", setTransparent);
                                
		ifrm.style.width = iWidth +"px";
		ifrm.style.height = iHeight +"px";
		ifrm.style.backgroundColor = bgColor;

		document.getElementById(sFrameID).appendChild(ifrm);
	}
}

function makeFrameBg2(sSrc, iWidth, iHeight, sAlign, iFrameborder, sScrolling, sFrameID) 
{
	debugFunctionTitle='makeFrame()';debug('entered function sSrc='+sSrc+', iWidth='+iWidth+', iHeight='+iHeight+', sAlign='+sAlign+', iFrameborder='+iFrameborder+', sScrolling='+sScrolling+', sFrameID='+sFrameID);
	if (!document.getElementById(sFrameID + 'ID'))
	{
		iWidth += ""; iHeight += "";
		if (iWidth == '-1'){
			iWidth = '640';
		} else if (iWidth.indexOf('full') != -1){
			iWidth = '100%';
		}
		if (iHeight == '-1'){
			iHeight = '480';
		} else if (iHeight.indexOf('full') != -1){
			iHeight = '100%';
		}
		if(!(iWidth.charAt(iWidth.length - 1) == '%' || iWidth.charAt(iWidth.length - 1) == 'x')){
			iWidth += "px";
		}
		if(!(iHeight.charAt(iHeight.length - 1) == '%' || iHeight.charAt(iHeight.length - 1) == 'x')){
			iHeight += "px";
		}
		if (sSrc == ''){sSrc='about:no-url-passed'};
		if (sAlign == ''){sAlign='left'};
		if (sScrolling == ''){sScrolling='auto'};
		ifrm = document.createElement("IFRAME");
		ifrm.setAttribute("id", sFrameID + 'ID');
		ifrm.setAttribute("Name", window.location.host);
		ifrm.setAttribute("src", sSrc);
		ifrm.setAttribute("align", sAlign);
		ifrm.frameBorder = iFrameborder;
		ifrm.setAttribute("scrolling", sScrolling);
		ifrm.style.width = iWidth;
		ifrm.style.height = iHeight;
		ifrm.style.backgroundColor = "#ffffff";

		if (iWidth == '100%' && iHeight == '100%'){
			$('body').css({'padding':'0','margin':'0'});
			$('body > div').each(function(){
				$(this).css('display', 'none');
			});
			$('body').append(ifrm);
		} else {
			$('#' + sFrameID).append(ifrm);
		}
	}
}

function debug(message) 
{   if (debugMode!='' || message=='')
	{   if (!debug.window_ || debug.window_.closed) 
	    {   var win = window.open("", "window_", "width=400,height=200,scrollbars=yes,resizable=yes,status=no,location=no,menubar=no,toolbar=no");
            if (!win) return;
            var doc = win.document;
            doc.write("<html><head><title>Debug Log</title></head>" + "<body><a href='javascript:window.close();'>[Close]</a></body></html>");
            doc.close();
            debug.window_ = win;
        }
        dayTwo = new Date();hrNow = dayTwo.getHours();mnNow = dayTwo.getMinutes();scNow = dayTwo.getSeconds();theTime = hrNow + ":" + mnNow + ":" + scNow ;
        var theDiv = debug.window_.document.createElement('div');
        var theP = debug.window_.document.createElement('p');
        var theBR = debug.window_.document.createElement('br');
        var theText = debug.window_.document.createTextNode(theTime + " " + debugMode + " " + debugFunctionTitle);
        var theText2 = debug.window_.document.createTextNode(message);
        theP.appendChild(theText);theP.appendChild(theBR);theP.appendChild(theText2);
        debug.window_.document.body.appendChild(theP);
    }
}


// The following 3 functions are added here for use on all specs pages that use CT_Mini_Spec. They handle the styling and send the update command to the flash where appropriate

function specLinkClick(oItem, movieName, sMediaUrl, sMediaType){
    $(".minispec-active-link").toggleClass("minispec-active-link");
    $("#" + oItem.id).toggleClass("minispec-active-link");
    updateMedia(movieName, sMediaUrl, sMediaType)
}

function specLinkHover(oItem){
    $(".minispec-hover-link").toggleClass("minispec-hover-link");
    $("#" + oItem.id + " img:first").toggleClass("minispec-hover-link");
}

function specLinkOut(oItem){
    $("#" + oItem.id + " img:first").toggleClass("minispec-hover-link");
}

function FormatMiniSpec()

{

            var contentDiv = ""

            var activeDiv = "div-link1"

            var activeLink = "a-link1"

           

            //Hide all and show first               

            $(".mini-specs-info-container").hide();

            $("#mini-specs-info-container1").show();

             

            //Update div based on click

            $(".image-container").click(function(){

                             

                contentDiv= "mini-specs-info-container" + this.id.replace("div-link" ,"" )

 

                //Hide all then show the main div relative to the click

                $(".mini-specs-info-container").hide();

                $("#" + contentDiv).show();

                //toggle the divs active state and update var(ready for next click)

                $("#" + this.id).toggleClass("div-active");

                $("#" + activeDiv).toggleClass("div-active");

                activeDiv = this.id                                                       

                $("#" + this.id + " a:first").toggleClass("link-active");

                $("#" + activeLink).toggleClass("link-active");        

                activeLink = $("#" + this.id + " a:first").get(0).id
            });
}


function RenderSearchDialog() {
            $("div.search-entry-header input.search-input").hide();
        $("div.search-entry-header input.magnify").hide()
        $("div.search-entry-initial").hover(function() {
            $("div.search-entry-initial").hide();
            $("div.search-entry-header input.search-input").show();
            $("div.search-entry-header input.magnify").show();
            }, function() {
                        
            });
            $("div.search-entry-header").hover(function() {
            
            }, function() {
              $("div.search-entry-initial").show();
            $("div.search-entry-header input.search-input").hide();
            $("div.search-entry-header input.magnify").hide();
            });
}


// Remove text decoration from key model names
var whenJQueryReady = setInterval(function() {
 if (typeof jQuery != 'undefined')
 {
     clearInterval(whenJQueryReady );
     $(document).ready(function() {
        $("h2:contains('RX 450h')").css("text-transform", "none");
        $("a:contains('RX 450h')").css("text-transform", "none");
        $("a:contains('LF-Xh')").css("text-transform", "none");
        $("a:contains('RX 400h HYBRID')").css("text-transform", "none");
        $("a:contains('IS 220d')").css("text-transform", "none");
        $("a:contains('LF-Ch')").css("text-transform", "none");
        $("a:contains('CT200h')").css("text-transform", "none");
        $("a:contains('CT 200h')").css("text-transform", "none");
        $("a:contains('IS 200d')").css("text-transform", "none");
        $("a:contains('iPhone')").css("text-transform", "none");
        $("a:contains('LS 600h')").css("text-transform", "none");
        $("a:contains('LF Gh')").css("text-transform", "none");
        $("a:contains('LF-Gh')").css("text-transform", "none");
        $("a:contains('GS 450h')").css("text-transform", "none");
        $("a:contains('GS450h')").css("text-transform", "none");

        $(function() { $('#txt-scroll-pane').jScrollPane({showArrows:true}); });
     })
 }
}, 100);


function ScrollMultiBlocks() {

    //Global
    $(".minispecs-video-thumb-block", $(".container")).hide();          //Hide all containers
    $(".minispecs-video-thumb-block:first", $(".container")).show();    //Show the first one 
    
    //Process the Next button click    
    $("a.minispecs-video-thumb-arrow-right").click(function() {
  
        var nextDiv = $(this);
        var x=1     //Counter, initialised as 1
        var sId=""  //Temp var, initialised blank
        var n = $("div.minispecs-video-thumb-block", $(this).parent()).length     //The number of container divs
        var oneToTurnOn;
        
        //Loop through the blocks and find which one is active
        $("div.minispecs-video-thumb-block", $(this).parent()).each(function(i){
            
            if($(this).css("display") == "block"){

                oneToTurnOn = i + 1;

                if (oneToTurnOn!=n){
                
                    //first turn the prev div back on
                    $("a.minispecs-video-thumb-arrow-left", $(this).parent()).removeClass("minispecs-arrow-inactive");
                    
                    //Hide all then show the next one
                    $("div.minispecs-video-thumb-block", $(this).parent()).hide();
                    $("div.minispecs-video-thumb-block:eq(" + oneToTurnOn + ")", $(this).parent()).show();
                    
                    //If we're the last one then updated the 'next' link, else break out the loop
                    if ((oneToTurnOn+1)==n){
                        $(nextDiv.addClass("minispecs-arrow-inactive"));
                    }
                    else{
                        return false;
                    }
                }
            }
        });       
    });
    
    //Process the Previous button click
    $("a.minispecs-video-thumb-arrow-left").click(function() {
  
        var prevDiv = $(this);           
        var x=1     //Counter, initialised as 1
        var sId=""  //Temp var, initialised blank
        var n = $("div.minispecs-video-thumb-block", $(this).parent()).length     //The number of container divs    
        var oneToTurnOn;
        
        //Loop through the blocks and find which one is active
        $("div.minispecs-video-thumb-block", $(this).parent()).each(function(i){
            
            if($(this).css("display") == "block"){

                oneToTurnOn = i - 1;

                if (oneToTurnOn+1!=0){

                    //first turn the next div back on
                    $("a.minispecs-video-thumb-arrow-right", $(this).parent()).removeClass("minispecs-arrow-inactive");
                     
                    //Hide all then show the previous one 
                    $("div.minispecs-video-thumb-block", $(this).parent()).hide();
                    $("div.minispecs-video-thumb-block:eq(" + oneToTurnOn + ")", $(this).parent()).show();
                    
                    //If we're the last one then updated the 'previous' link, else break out the loop
                    if ((oneToTurnOn)==0){
                        $(prevDiv.addClass("minispecs-arrow-inactive"));
                    }
                    else{
                        return false;
                    }
                }
            }
        });       
    });
    

}



function matchHeight(sId,sTag){

    var targOuterContainer,targElements,contDivs,maxHeight,divHeight,d;

     try {

    // get all <div> elements in the document with id hours-section
    targOuterContainer = document.getElementById(sId);
    targElements = targOuterContainer.getElementsByTagName(sTag);

    contDivs=[];

    // initialize maximum height value
    maxHeight=0;

    // iterate over all tag elements in the id divs 
    for(var i=0;i<targElements.length;i++){
       
       
        d=targElements[i];

        contDivs[contDivs.length]=d;

        // determine height for <h5> element
        if(d.offsetHeight){
            divHeight=d.offsetHeight;
        }
        else if(d.style.pixelHeight){
            divHeight=d.style.pixelHeight;
        }

        // calculate maximum height
        maxHeight=Math.max(maxHeight,divHeight);
    }

    // assign maximum height value to all of the tag elements
    for(var i=0;i<contDivs.length;i++){
        contDivs[i].style.height=maxHeight + "px";
    }

  }

  catch(err) {

 }
}

// New functionality to test if Spotlights are empty and hide the HTML (to fix an IE bug)
// mpaton added 8/06/2009

function HideEmptySpotlights() {
$("div.spotlight").each(function(t) {
if ($(this).html() != "") {} else {
$(this).css("display", "none");
}
});}




/*-----------------------------------------------------------------------------------*/


(function($) {										// Compliant with jquery.noConflict()
$.fn.jCarouselLite = function(o) {
	o = $.extend({
		btnPrev: null,
		btnNext: null,
		slideNav: 0,
		btnGo: null,
		mouseWheel: false,
		auto: null,
		speed: 200,
		easing: null,
		vertical: false,
		circular: false,
		visible: null,
		start: 0,
	scroll: null,
		beforeStart: null,
		afterEnd: null
	}, o || {});
	return this.each(function() {						 // Returns the element collection. Chainable.
		var running = false, animCss=o.vertical?"top":"left", sizeCss=o.vertical?"height":"width";
		var div = $(this), ul = $("ul", div), 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;
		}
		
		div.hover(function(){div.hovered = true;}, function() {div.hovered = false;});
		
		var li = $("li", ul), itemLength = li.size(), curr = o.start;
		div.css("visibility", "visible");
		li.css({float: o.vertical ? "none" : "left"});
		ul.css({margin: "0", padding: "0", position: "relative", "list-style-type": "none", "z-index": "1"});
		div.css({overflow: "hidden", position: "relative", "z-index": "2", left: "0px"});
		var liSize = o.vertical ? height(li) : width(li);   // Full li size(incl margin)-Used for animation
		var ulSize = liSize * itemLength;				 // size of full ul(total length, not just for the visible items)
		var divSize = liSize * v;						 // size of entire div(total length for just the visible items)
		li.css({height: "100%"});
		ul.css(sizeCss, ulSize+"px").css(animCss, -(curr*liSize));
		ul.css({'float':'left'});
		div.css(sizeCss, divSize+"px");					 // Width of the DIV. length of visible images
		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, val) {
				$(val).click(function() {
				div.navigated = true;
				
				//added in the instance where you want a dynamic slide navigation on the carousel
				if(o.slideNav)
		        {
		            if(!running) {
				        $(".spNav"+curr).removeClass("highlight"); 
			            $(".spNav"+(o.circular ? o.visible+i : i)).addClass("highlight");
			            //alert("REMOVE - .spNav"+curr+ ", ADD" +(o.circular ? o.visible+i : i));    
		            }
				}
				return go(o.circular ? o.visible+i : i);
				
				});
			});
			
		
		if(o.mouseWheel && div.mousewheel)
			div.mousewheel(function(e, d) {
				return d>0 ? go(curr-o.scroll) : go(curr+o.scroll);
			});
		
		
		
		if(o.auto)
            setInterval(function() {
            if(!div.hovered)
            
                go(curr+o.scroll);
            }, o.auto+o.speed);

        function vis() {
            return li.slice(curr).slice(0,v);
        };
		

$(document).ready(function(){    

if(itemLength <=v) {                     
  $(".gallery-nav .nav-item-next").addClass("disabled")
}   

initMagazineArchive();

});

		function go(to) {
            if(!running) {
            
               
         			//added in the instance where you want a dynamic slide navigation on the carousel
				if(o.slideNav)
		        {
		        //alert(to);
				    $(".spotlight-container .spotlight-nav div").removeClass("highlight");
				    
                    //alert("remove all selected");
		            //workaround for bug in carousel
		            if(to > o.slideNav)
		            {
		            
		                $(".spNav"+(to-o.slideNav)).addClass("highlight");
		                //alert(" ADD .spNav"+(to-o.slideNav));  
		            }				    
				    else
				    {
				    
			            $(".spNav"+(to)).addClass("highlight");
			            //alert("2 ADD .spNav"+(to));
			        
		            }

		        } 
            
                if(o.beforeStart)
                    o.beforeStart.call(this, vis());





                if(o.circular) {            // If circular we are in first or last, then goto the other end
         
         
         
         
         
         
         
                    if(to<=o.start-v-1) {           // If first, then goto last
						ul.css(animCss, -((itemLength-(v*2))*liSize)+"px");
						// If "scroll" > 1, then the "to" might not be equal to the condition; it can be lesser depending on the number of elements.
						
						curr = to==o.start-v-1 ? itemLength-(v*2)-1 : itemLength-(v*2)-o.scroll;
					} else if(to>=itemLength-v+1) { // If last, then goto first
						ul.css(animCss, -( (v) * liSize ) + "px" );
						// If "scroll" > 1, then the "to" might not be equal to the condition; it can be greater depending on the number of elements.
						curr = to==itemLength-v+1 ? v+1 : v+o.scroll;
					} else curr = to;
				} else {					// If non-circular and to points to first or last, we just return.
					if(to<0 || to>itemLength-v) return;
					else curr = to;
				}						 // If neither overrides it, the curr will still be "to" and we can proceed.
				running = true;
				ul.animate(
					animCss == "left" ? { left: -(curr*liSize) } : { top: -(curr*liSize) } , o.speed, o.easing,
					function() {
						if(o.afterEnd)
							o.afterEnd.call(this, vis());
						running = false;
					}
				);
				// Disable buttons when the carousel reaches the last/first, and enable when not
				if(!o.circular) {

					$(o.btnPrev + "," + o.btnNext).removeClass("disabled");
					$( (curr-o.scroll<0 && o.btnPrev)
						||
					 (curr+o.scroll > itemLength-v && o.btnNext)
						||
					 []
					 ).addClass("disabled");


					if ($(".gallery-nav .nav-item-prev a").hasClass("disabled"))
					{
		        				$(".gallery-nav .nav-item-prev").addClass("disabled")
					}
					else
					{
						$(".gallery-nav .nav-item-prev").removeClass("disabled")
					}
					if ($(".gallery-nav .nav-item-next a").hasClass("disabled"))
					{
		        				$(".gallery-nav .nav-item-next").addClass("disabled")
					}
					else
					{
						$(".gallery-nav .nav-item-next").removeClass("disabled")
					}
				}
			}
			return false;
		};
	});
};
function css(el, prop) {
	return parseInt($.css(el[0], prop)) || 0;
};
function width(el) {
	return  el[0].offsetWidth + css(el, 'marginLeft') + css(el, 'marginRight');
};
function height(el) {
	return el[0].offsetHeight + css(el, 'marginTop') + css(el, 'marginBottom');
};

})(jQuery);


function resizeHeader() {
    
    var searchWidth = 0;
    var socialWidth = 0;
    var searchBox = 0;
    var quicklinkWidth = 0;
    var utilitiesWidth = 0;
    var primarynavWidth = 0;
    var primarynavHeight = 0;
    //header width is currently fixed to 944 pixels
    var headerWidth = 944;
    var currentJTTop = 0;
    var imageHeight = 0;
    var ie = (/MSIE ((5\.5)|6|7|8)/.test(navigator.userAgent) && navigator.platform == "Win32");
	
		//do we have a search bar?           
		searchWidth = getWidth('.search-entry-header');
		//get search bar input box width (appears on hover)
		searchBox = getWidth('.search-entry-header .search-input');
		//do we have a social links section
		socialWidth = getWidth('#sociallinkscontainer');
		//do we have a quick links section
		quicklinkWidth = getWidth('#quicklinkscontainer');
		utilitiesWidth = searchWidth + socialWidth + quicklinkWidth + searchBox;

		if ($('#primary-navigation ').length != 0) {
			primarynavWidth = ($('#primary-navigation ').outerWidth());
			primarynavHeight = ($('#primary-navigation ').height());
		} 
		
		if ((primarynavWidth + utilitiesWidth) > headerWidth || primarynavHeight > 35) {
			if (ie) $('#primary-navigation').wrap('<div style="clear:both;" />');
			($('#primary-navigation').css({width:'930px', margin:'0px', clear: 'both'}));  
		}         
    }
    
    function getWidth(objElement){
            if ($(objElement).length != 0) {
                return parseInt($(objElement).width());
            }
    }

    function initMagazineArchive() {
      $('body.magazine div.archive .accordion p a.selected').parent().parent().parent().toggleClass('show');
      $('body.magazine div.archive .accordion-container h4 a').click(function(e) {
		 var $accContainer = $(this).parent().parent();
		 if ($accContainer.hasClass('show')) {
			$accContainer.find(".accordion").slideToggle("fast", function() {
				$accContainer.toggleClass('show');
			});
		 }
		 else {
			$accContainer.find(".accordion").slideToggle("fast");
			 $accContainer.toggleClass('show');
		}
		e.preventDefault();
      });
    }

/*$(document).ready(function(){
	$("div.info-block div.info-block-inner").each(function(){
		$(this).css( 'cursor', 'pointer' );
		$(this).click(function(){
			$("a:first", this).triggerHandler("click"); 
		});                           
	});
});*/

$(document).ready(function(){
	$("div.info-block div.info-block-inner").each(function(){
		$(this).css( 'position', 'relative' );
		$("a:last", this).append('<span style="cursor:pointer;position:absolute;width:100%;min-height:65px;height:100%;top:0;left:0;z-index:1;background-image:url(onepixel.gif);"></span>');	
	});
});

function openYouTubeFB(url){
	$.fancybox({ 'titleShow': false, 'transitionIn': 'elastic', 'transitionOut': 'elastic', 'centerOnScroll': 'true',  'href' : url, 'type' : 'swf', 'swf' : { 'wmode' : 'transparent', 'allowfullscreen' : 'true'}});
};

(function($){
$.fn.detectModelName = function(method) {
        var modelNames=['CT 200h','IS 200d','IS 250C','IS 250','IS F','GS 450h','LS 600h L','LS 600h','RX 450h','LFA','GS F SPORT','F SPORT','GS 450h F SPORT','GS 250'];
        $.each(modelNames,function(){
            var currentModel=this.toString();
            $('p').each(function(){
                var rege = new RegExp(currentModel, "g");
                $(this).html($(this).html().replace(rege,'<span class="model-name">'+currentModel+'</span>'))
            })
        })
    }
})(jQuery);
/*UPDATE TO STANDARD FUNCTIONALITY: Addition of disableScrollTop parameter see blog notes */

/* Copyright (c) 2006 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 33 2008-12-10 22:55: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)
 *								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
 *								disableScrollTop 	-   Whether to disable scroll to top when inner pane item is clicked (see http://code.google.com/p/jscrollpane/issues/detail?id=77)
 * @return jQuery
 * @cat Plugins/jScrollPane
 * @author Kelvin Luck (kelvin AT kelvinluck DOT com || http://www.kelvinluck.com)
 */

(function($) {

$.jScrollPane = {
	active : []
};
$.fn.jScrollPane = function jScrollPane(settings)
{
	settings = $.extend({}, $.fn.jScrollPane.defaults, settings);

	var rf = function rf() { return false; };
	
	return this.each(
		function()
		{
			var $this = $(this);
			// 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');
			var paneEle = this;
			
			if ($(this).parent().is('.jScrollPaneContainer')) {
				var currentScrollPosition = settings.maintainPosition ? $this.position().top : 0;
				var $c = $(this).parent();
				var paneWidth = $c.innerWidth();
				var paneHeight = $c.outerHeight();
				var trackHeight = paneHeight;
				$('>.jScrollPaneTrack, >.jScrollArrowUp, >.jScrollArrowDown', $c).remove();
				$this.css({'top':0});
			} else {
				var currentScrollPosition = 0;
				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);
				var paneWidth = $this.innerWidth();
				var paneHeight = $this.innerHeight();
				var trackHeight = paneHeight;
				$this.wrap(
					$('<div></div>').attr(
						{'className':'jScrollPaneContainer'}
					).css(
						{
							'height':paneHeight+'px', 
							'width':paneWidth+'px'
						}
					)
				);
				// 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);
					}
				);
				
			}
			
			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', 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);
								settings.reinitialiseOnImageLoad = false;
								$this.jScrollPane(settings); // 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 cssToApply = {
				'height':'auto',
				'width':paneWidth - settings.scrollbarWidth - settings.scrollbarMargin - p + '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;

			if (percentInView < .99) {
				var $container = $this.parent();
				$container.append(
					$('<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'})
						)
					)
				);
				
				var $track = $('>.jScrollPaneTrack', $container);
				var $drag = $('>.jScrollPaneTrack .jScrollPaneDrag', $container);
				
				if (settings.showArrows) {
					
					var currentArrowButton;
					var currentArrowDirection;
					var currentArrowInterval;
					var currentArrowInc;
					var whileArrowButtonDown = function()
					{
						if (currentArrowInc > 4 || currentArrowInc%4==0) {
							positionDrag(dragPosition + currentArrowDirection * mouseWheelMultiplier);
						}
						currentArrowInc ++;
					};
					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'})
								.css({'width':settings.scrollbarWidth+'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'})
								.css({'width':settings.scrollbarWidth+'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;
						$track
							.css({'height': trackHeight+'px', top:settings.arrowSize+'px'})
					} else {
						var topArrowHeight = $upArrow.height();
						settings.arrowSize = topArrowHeight;
						trackHeight = paneHeight - topArrowHeight - $downArrow.height();
						$track
							.css({'height': trackHeight+'px', top:topArrowHeight+'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);
					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)
				{
					destY = destY < 0 ? 0 : (destY > maxY ? maxY : destY);
					dragPosition = destY;
					$drag.css({'top':destY+'px'});
					var p = destY / maxY;
					$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();
				};
				
				$track.bind('mousedown', onTrackClick);
				
				$container.bind(
					'mousewheel',
					function (event, delta) {
						initDrag();
						ceaseAnimation();
						var d = dragPosition;
						positionDrag(dragPosition - delta * mouseWheelMultiplier);
						var dragOccured = d != dragPosition;
						return !dragOccured;
					}
				);

				// Ipad Iphone
				if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i)) || (navigator.userAgent.match(/iPad/i))||(navigator.userAgent.match(/Android/i))) {
					var isTouchScreen = 1;
				}else{
					var isTouchScreen = 0;
				}

				$container.bind('touchstart', function(e){
					var cpos = dragPosition;                                                                               
					if(isTouchScreen){
						e = e.originalEvent.touches[0];
					}
					var sY = e.pageY;
					var sX = e.pageX;
					$container.bind('touchmove',function(ev){
						if(isTouchScreen){
							ev.preventDefault();
							ev = ev.originalEvent.touches[0];
						}                                                                                             
						var top = cpos-(ev.pageY-sY);
						positionDrag(top);
					});
					$container.bind('touchend',function(ev){
						$container.unbind('touchmove touchend');
					});
				});

				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 (settings.disableScrollTop)
					{	return;
						//this is due to a bug in the JScroller that forces the container pane
						// to scroll to the top when a click is recognised. See related items 
						// http://code.google.com/p/jscrollpane/issues/detail?id=77
					}   
					if (typeof pos == "string") {
						$e = $(pos, $this);
						if (!$e.length) return;
						pos = $e.offset().top - $this.offset().top;
					}
					$container.scrollTop(0);
					ceaseAnimation();
					var destDragPosition = -pos/(paneHeight-contentHeight) * maxY;
					if (preventAni || !settings.animateTo) {
						positionDrag(destDragPosition);
					} else {
						_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;
						
						while ($e[0] != $this[0]) {
							eleTop += $e.position().top;
							$e = $e.offsetParent();
						}
						
						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);
						}
					}
				)
				
				// NOTE: custom. eliminate the code bellow. it causes 'Syntax error, unrecognized expression: #' in jQuery 1.3.2 on IE
                // if (location.hash) {
                //  scrollTo(location.hash);
                // }
				
				// 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.substr(0, 1) == '#' && h.length > 1) { // NOTE: custom code - <<&& h.length > 1>> !!! 
								scrollTo(h);
							}
						}
					}
				);
				
				$.jScrollPane.active.push($this[0]);
				
			} else {
				$this.css(
					{
						'height':paneHeight+'px',
						'width':paneWidth-this.originalSidePaddingTotal+'px',
						'padding':this.originalPadding
					}
				);
				// remove from active list?
				$this.parent().unbind('mousewheel');
			}
			
		}
	)
};

$.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,
	disableScrollTop : false
};

// 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);

/* Copyright (c) 2009 Brandon Aaron (http://brandonaaron.net)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
 * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
 *
 * Version: 3.0.2
 * 
 * Requires: 1.2.2+
 */
(function(c){var a=["DOMMouseScroll","mousewheel"];c.event.special.mousewheel={setup:function(){if(this.addEventListener){for(var d=a.length;d;){this.addEventListener(a[--d],b,false)}}else{this.onmousewheel=b}},teardown:function(){if(this.removeEventListener){for(var d=a.length;d;){this.removeEventListener(a[--d],b,false)}}else{this.onmousewheel=null}}};c.fn.extend({mousewheel:function(d){return d?this.bind("mousewheel",d):this.trigger("mousewheel")},unmousewheel:function(d){return this.unbind("mousewheel",d)}});function b(f){var d=[].slice.call(arguments,1),g=0,e=true;f=c.event.fix(f||window.event);f.type="mousewheel";if(f.wheelDelta){g=f.wheelDelta/120}if(f.detail){g=-f.detail/3}d.unshift(f,g);return c.event.handle.apply(this,d)}})(jQuery);
/*!
 * Share Control Javascript
 * 
 * Date: 		$LastChangedDate: 2009-11-16 Mark Saunders call dcsTrk on Share form $
 * Date: 		$LastChangedDate: 2009-10-20 Mark Saunders fix to checkemail regex $
 * Revision:	$Revision: 752 $
 */

Sc = (function($) {

var maxMsgLen = 250
var params 		= parseQueryStr(document.location.href)
var title 		= params.title
var linkurl		= params.url
var campaign	= params.campaign
var socialGroup = params.social
var emailTitle	= ""
var emailHeader = ""
var emailFooter	= ""
var emailUrl	= "/site-tools/aspxFormPost.asp?TMMEACTION=SAVE&amp;EMAILFORM=YES&amp;EMAILFORMONLY=YES&amp;EMAILFROM={from}&amp;EMAILTO={to}&amp;EMAILSUBJECT={subject}&amp;EMAILBODY={body}"
var shareSites	= []
var socialSites	= []

function checkEmail(str) {
	//return /^[\n &lt;&quot;']*([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+)/.test(str)
    /*
    source: http://regexlib.com/DisplayPatterns.aspx
    regex to validate email address noteworthy: 
    (1) It allows usernames with 1 or 2 alphanum characters, or 3+ chars can have -._ in the middle. username may NOT start/end with -._ or any other non alphanumeric character. 
    (2) It allows heirarchical domain names (e.g. me@really.big.com). Similar -._ placement rules there. 
    (3) It allows 2-9 character alphabetic-only TLDs (that oughta cover museum and adnauseum :&gt;). 
    (4) No IP email addresses though -- I wouldn't Want to accept that kind of address
    */

	return /^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})((,|;)\s?[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})*$/.test(str)
}                   
                       var br_sharelables = {
				fromError:		"Skriv inn e-postadressen i et gyldig format",
				toError:		"Skriv inn vennens e-postadressen i et gyldig format",
				messageError:	"Skriv meldingen",
				sendConfirm:	"Meldingen er sendt til mottakeren",
				sendError:		"Det oppstod en feil under sending av meldingen"
			}
var formElements = {   from:{valueSelector:"#fromEmail",errorSelector:"#fromEmailError",validator:checkEmail,errorMsg:br_sharelables.fromError},
					     to:{valueSelector:"#toEmail",errorSelector:"#toEmailError",validator:checkEmail,errorMsg:br_sharelables.toError},
					message:{valueSelector:"#message",errorSelector:"#messageError",validator:function(str){return (str&&str.length>0&&str.length<=maxMsgLen)},errorMsg:br_sharelables.messageError}}



$(document).ready(function() {

	if ((campaign==null)||(campaign.length==0)||(campaign=='null')) campaign = "*"

	$.ajax({
		type: "GET",
		url: "/sys/dotnet/xml/share-config.xml",
		dataType: "xml",
		success: function(xml) {
			
			var $xml 	= $(xml)
			$xml.find("content > item[id='sharesite']").each(function() {
				var $this 			= $(this)
				var result  		= {}
				result.display		= $this.find('title').text()
				result.id			= result.title 
				result.icon			= $this.find('icon').text()
				result.urlPattern	= $this.find('url_link').text()
				shareSites.push(result);
			});
			
			if (socialGroup) {socialGroup = '-' + socialGroup}
            $xml.find("content > item[id='socialgroup" + socialGroup + "']").each(function() {
                var $this 			= $(this)               
                var result  		= {}
                result.display		= $this.find('title').text()
                result.id			= result.title 
                result.icon			= $this.find('icon').text()
                result.urlPattern	= $this.find('url_link').text()
                socialSites.push(result);
            });
			
			title    = validateParam(title,"")
			linkurl  = validateParam(linkurl,"")
			campaign = validateParam(campaign,"*")

			emailUrl = validateParam($xml.find("content > item[id='emailurl'] > url_link").text(),emailUrl)	
			
			var defaultTitle
			var defaultHeader
			var defaultFooter
			
			$xml.find("content > item[id='email']").each(function() {
				var $this 			= $(this)
				var configText 		= $this.find('text').text()
				var instCampaign	= $this.find('instruction[id="1"]').text()
				var instType		= $this.find('instruction[id="2"]').text()
				
				if (instCampaign=="*") {
					if (instType=="title") defaultTitle = configText
					else if (instType=="header") defaultHeader = configText
					else if (instType=="footer") defaultFooter = configText
				}
				
				if (instCampaign==campaign) {
					if (instType=="title") emailTitle = configText
					else if (instType=="header") emailHeader = configText
					else if (instType=="footer") emailFooter = configText
				}
			})
			
			emailTitle  = validateParam(emailTitle,defaultTitle)
			emailHeader = validateParam(emailHeader,defaultHeader)
			emailFooter = validateParam(emailFooter,defaultFooter)
			
			title = emailTitle + " " + title
			
			//buildSitesMarkup($("#shareSiteList"))
			if ($.isFunction(window.shareCustom)) window.shareCustom()
	
			$('#emailForm').submit(function(event) {
			//$('#tellFriendSend').click(function(event) {
				event.preventDefault()
				submitEmail()
			})

			
			$('#shareClose').click(function(event) {
				event.preventDefault()
				self.parent.tb_remove()
			})
		},
		complete: function() {
		    if (shareSites.length < 1) {
                $("#shareSection").css("display", "none");
            } else {
                buildSitesMarkup($("#shareSiteList"))
            }
            
            if (socialSites.length < 1) {
                $("#socialSection").css("display", "none");
            } else {
                buildSocialMarkup($("#socialSiteList"))
            }
        }
	});
//				self.parent.tb_remove()
//			})
//		}
//	});
})

function validateParam(param,defaultValue) {
	return ((param==null)||(param.length==0)||(param=='null')) ? defaultValue : param 
}


function submitEmail() {
	var errors = false
	for (var formElm in formElements) {
		var elm = formElements[formElm]
		var $elm = $(elm.valueSelector)
		elm.value = $elm.val()
		if (!elm.validator(elm.value)) {
			$(elm.errorSelector).html(elm.errorMsg)
			$(elm.errorSelector).show()			
			$elm.addClass("inputError")
			errors = true
		} else {
			$(elm.errorSelector).hide()	
			$(elm.errorSelector).html("&nbsp;")
			$elm.removeClass("inputError")
		}
}

	if (errors) return;

var content = $("#message").val();
var from = $("#fromEmail").val();
var to = $("#toEmail").val().replace(/,/g, ";").replace(/ /g, "");

	content = content.replace(/<\/?[^>]+(>|$)/g, "");
	var emailMessage = encodeURIComponent(emailHeader)
                                      + encodeURIComponent("###LF###")
		      + encodeURIComponent(content.replace(/\n/ig,  "###LF###"))
                                      + encodeURIComponent("###LF###")
		      + linkurl 
                                      + encodeURIComponent("###LF###")
		      + encodeURI(emailFooter)

	//var thisEmailUrl = encodeURI(emailUrl.replace(/\{from\}/, from ).replace(/\{to\}/, to ).replace(/\{body\}/, message ).replace(/\{subject\}/, title ) )
	var emailMessageUrl = emailUrl.replace(/\{from\}/, from ).replace(/\{to\}/, to ).replace(/\{body\}/, emailMessage).replace(/\{subject\}/, encodeURI(title) );

            try {
		if (/fakeEmail.html/.test(emailMessageUrl)){
			window.open(emailMessageUrl);
			$('#emailMsg').html(br_sharelables.sendConfirm)
		}
		else {
			$.post(emailMessageUrl, function(data){
				$('#emailMsg').html(br_sharelables.sendConfirm)
//MS:091116:UPDATE
				try {   dcsTrk('WT.pc=submit&WT.si_x=2&WT.si_cs="1"'); }
				catch(err) { }
//MS:091116:UPDATE END
			});
		}
	} catch (e) {
		$('#emailMsg').html(br_sharelables.sendError)
	}
	//self.parent.jQuery.fn.shareButton.close()
}

function buildSitesMarkup ($shareSiteList) {
    var ICON_SIZE = 16
    var createCallBack = function(name) { return function(){
		//alert(name)
	} }
        
    $shareSiteList.html('');
        
    for (var i=0; i < shareSites.length; i++) {
            
        var site = shareSites[i]

        var href = site.urlPattern.replace(/\{u\}/, linkurl).replace(/\{t\}/, title)

//MS:091116:UPDATE
		$('<li class="shareSite">' +
			'<a target="_blank" href="' + href + '" class="shareSiteLink" id="'+site.id+'" title="' + site.display + '" onclick="try{dcsTrk(\'WT.pn=Share&WT.si_x=2&WT.ti=' + site.display + '\')} catch(err){ }">'+
				'<span class="siteIcon" style="background: url('+site.icon+') no-repeat;"></span>'+
				site.display +
			'</a>'+
		  '</li>'
		//).click( createCallBack(site.display) ).appendTo($shareSiteList)
		).appendTo($shareSiteList)
    };
}
//MS:091116:UPDATE END

function buildSocialMarkup ($socialSiteList) {
    var ICON_SIZE = 16
    var createCallBack = function(name) { return function(){
        //alert(name)
    } }
        
    $socialSiteList.html('');
        
    for (var i=0; i < socialSites.length; i++) {
        var site = socialSites[i]
        var href = site.urlPattern.replace(/\{u\}/, linkurl).replace(/\{t\}/, title)

        $('<li class="shareSite">' +
            '<a target="_blank" href="' + href + '" class="shareSiteLink" id="'+site.id+'" title="' + site.display + '" onclick="try{dcsTrk(\'WT.pn=Share&WT.si_x=2&WT.ti=' + site.display + '\')} catch(err){ }">'+
                '<span class="siteIcon" style="background: url('+site.icon+') no-repeat;"></span>'+
                site.display +
            '</a>'+
          '</li>'
        ).appendTo($socialSiteList)
    };
}

function parseQueryStr(url) {
    function readVal(kv) { return decodeURI(kv.length === 2 ? kv[1] : '') }
    var i = url.indexOf('?')
    if (i === -1) { return {} }
    var q = url.substring(i + 1),
        params = {}
    $.each(q.split('&'), function(i, p) {
        var kv = p.split('=')
        var k = kv[0]
        if (params.hasOwnProperty(k)) {
            var v = params[k]
            if (!$.isArray(v)) {
                v = [v] // turn it into array
                params[k] = v
            }
            v.push(readVal(kv))
        }
        else {
            params[k] = readVal(kv)
        }
    })
    return params
}

})(jQuery)
function twitterCallback2(twitters) {

if (twitters != null && twitters != 'undefined') {
 $("#twitter_update_list").css("visibility", "hidden");
  var statusHTML = [];
  for (var i=0; i<twitters.length; i++){
    var username = twitters[i].user.screen_name;
    var status = twitters[i].text.replace(/((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, function(url) {
      return '<a href="'+url+'">'+url+'</a>';
    }).replace(/\B@([_a-z0-9]+)/ig, function(reply) {
      return  reply.charAt(0)+'<a href="http://twitter.com/'+reply.substring(1)+'">'+reply.substring(1)+'</a>';
    });
    statusHTML.push('<li><span>'+status+'</span> <a target="_blank" style="font-size:85%" href="http://twitter.com/'+username+'/statuses/'+twitters[i].id+'">'+relative_time(twitters[i].created_at)+'</a></li>');

var replaceLFCHScreenName = twitters[i].user.screen_name;
replaceLFCHScreenName = replaceLFCHScreenName.replace('LFCh', 'CT200h');

  $("a#blog-feed-link").attr("href", "http://twitter.com/" + replaceLFCHScreenName );
$("a#blog-feed-link").attr("target", "_blank");
  }
  $("#twitter_update_list").html(statusHTML.join(''));
  $("#twitter_update_list").css("visibility", "visible");

   var t;
   clearTimeout(t) 

   // FADE IN CONTENT
   t = setTimeout(function() 
   {
      $("#twitter_update_list").css("display", "block");
   }, 500);  

}
else {
$("#twitter_update_list").html("Error");
}
  
}

function relative_time(time_value) {
  var values = time_value.split(" ");
  time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
  var parsed_date = Date.parse(time_value);
  var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
  var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
  delta = delta + (relative_to.getTimezoneOffset() * 60);

  if (delta < 60) {
    return 'less than a minute ago';
  } else if(delta < 120) {
    return 'about a minute ago';
  } else if(delta < (60*60)) {
    return (parseInt(delta / 60)).toString() + ' minutes ago';
  } else if(delta < (120*60)) {
    return 'about an hour ago';
  } else if(delta < (24*60*60)) {
    return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
  } else if(delta < (48*60*60)) {
    return '1 day ago';
  } else {
    return (parseInt(delta / 86400)).toString() + ' days ago';
  }
}





function initBlogStream() {

var page = parseInt(1);
$("a#blog-feed-prev").css("visibility", "hidden");
var numberOfEntries = $("#blogfeed ul#twitter_update_list li");
for (var i=0; i<numberOfEntries.length; i++) {
$(numberOfEntries).eq(i).hide()
}
$(numberOfEntries).eq(page-1).show();

$("#blogfeed").fadeIn("slow");

$("a#blog-feed-next").click(function() {
$("a#blog-feed-prev").css("visibility", "visible");
page++;
if (page > numberOfEntries.length) {
page = numberOfEntries.length;
}

else {
displayPage(page-1);
if (page == numberOfEntries.length) { $(this).css("visibility", "hidden");  }
}
return false;
});

$("a#blog-feed-prev").click(function() {
$("a#blog-feed-next").css("visibility", "visible");
page--;
if (page <= 1) {
page = 1;
$(this).css("visibility", "hidden");;
}
displayPage(page-1);
return false;
});

}

function displayPage(number) {
$("#blogfeed ul li").hide();
$("#blogfeed ul li").eq(number).fadeIn();
}


function initMediaStream() {

  // Global variables

  var to = 0;
  var from = 0;
  var modulusIndex = 0;
  var pages = 0;
  var page = 1;
   
  $("a#image-gallery-slideshow-prev").css("visibility", "hidden");                   
  var location = window.location.href;
  if (location.indexOf("?") > -1) {
  location = location  + "&method=requestflickrjson";
  }
else {
  location = location  + "?method=requestflickrjson";
}



  jQuery.ajax({
    type: "GET",
    url: location,
    dataType: "json",
    cache : "false",    
    success: function(data){   
                
     // alert("Data Length: " + data.items.length);

        $("div.image-gallery-slideshow").css("display", "none");                
                
        var numberOfItems = 0;                               

        if (data.items != null) {
            numberOfItems = data.items.length;
        }
        
        // Calculate how many we can fit on a page. This is dependent on the width of any free space in the container. 
        // Get the container that the div is sitting in.
        
        var containerWidth = $("div.image-gallery-slideshow").parent().width();

        var actualWidth = 0;
        
        // See if there's any other elements taking up space.
        
        var combinedWidth = $("div.image-gallery-slideshow").parent().children();     
                   
        $.each(combinedWidth, function(item) {
            if (this.className != "image-gallery-slideshow")    {
            actualWidth += isNaN(parseInt($(this).css("width"))) ? 0 : parseInt($(this).css("width"));
            actualWidth += isNaN(parseInt($(this).css("margin-right"))) ? 0 : parseInt($(this).css("margin-right"));
            actualWidth += isNaN(parseInt($(this).css("margin-left"))) ? 0 : parseInt($(this).css("margin-left"));         
            }
        });

        var itemWidth = 117;   
  
        if (actualWidth != 0) {
        
        // Calculate the number of DD's we can show per "block"        

        $("div.image-gallery-slideshow").css("width", 944 - 22 - actualWidth + "px" );
        
        }
        
        else {
            $("div.image-gallery-slideshow").css("width", "922px");
        }
        to = modulusIndex = parseInt(Math.ceil(parseInt($("div.image-gallery-slideshow").css("width")) - 22)  / itemWidth);           
       
            if (numberOfItems <= modulusIndex) {
        $("a#image-gallery-slideshow-next").css("visibility", "hidden");   
        }
       

        pages = parseInt(Math.ceil(numberOfItems / modulusIndex));
 
        var widthOfCurrentDisplayingItems = (modulusIndex * itemWidth);
        $("#image-gallery-slideshow").css("width", (parseInt($("div.image-gallery-slideshow").css("width")) - 22) + "px"); // deal with 11px
        
        // Work out the margin required for each one without wrapping               
        
        var marginToFill = Math.floor(parseInt($("#image-gallery-slideshow").css("width"))-parseInt(117 * modulusIndex));
   
        applyMargin = Math.floor(parseInt(marginToFill / (modulusIndex - 1)))        
        
            // Initialisation
       
            $.each(data.items, function(i,item) {        
                      
            if (i < modulusIndex)
                $("#image-gallery-slideshow").append("<a target='_blank'  href='" + item.link + "'><img class='photostream' src='" + item.media.m + "'/></a>");                                                                                                            
            else 
                $("#image-gallery-slideshow").append("<a target='_blank'  href='" + item.link + "'><img class='photostream' style='display:none' src='" + item.media.m + "'/></a>");                                 
            });
          
             for (var o=from; o<to; o++) {
             $("#image-gallery-slideshow img.photostream").eq(o).css("margin-right", applyMargin);
             }
          
            $("#image-gallery-slideshow img.photostream").eq(modulusIndex-1).css("margin-right", "0px");        
                       
        $("div.image-gallery-slideshow").fadeIn();                                        
        
        reBindClicks(); 

           $("a#image-gallery-slideshow-next").click(function() {     
                $("a#image-gallery-slideshow-prev").css("visibility", "visible");
                page++;                                 
                
                if (page > pages) {
                    page = pages;                                                                               
                }        
                
                else {                            
                    from = from + modulusIndex;
                    to = to + modulusIndex;                                  
                    showImageRange($("#image-gallery-slideshow img.photostream"), from, to);                 
                    
                    if (page == pages) {
                        $(this).css("visibility", "hidden"); 
                    }
                }            
return false;                                                                    
           });
           
           $("a#image-gallery-slideshow-prev").click(function() {   
                $("a#image-gallery-slideshow-next").css("visibility", "visible");
                
                page--;
                
                 if (page == 0) {
                    page = 1;
                  
                }
                   else { 
                        
                        from = from - modulusIndex;
                        to = to - modulusIndex;      
       
                    showImageRange($("#image-gallery-slideshow img.photostream"), from, to);                                         
                      
                      if (page == 1) {
                         $(this).css("visibility", "hidden"); 
                      }
                }
return false;
           });                            
                                               
           $("#image-gallery-slideshow img.photostream").hover(
                function () {                               
                   $(this).fadeTo(100, 0.5);
                }, 
                function()
                {
                  $(this).fadeTo(100, 1);
                });
           
    },
    error: function(XMLHttpRequest, textStatus, errorThrown){
//        alert("Error :   " + errorThrown + " " + textStatus);
    }
  });



  function reBindClicks() {

  $("#image-gallery-slideshow a").click(function() {       
       dcsTrk("WT.ac=LF-Ch_flickr_image_clicked");
     }); 

}    

}

function showImageRange(imgref, from, to) {
    imgref.hide();
    for (var t=from; t<to; t++) {
       imgref.eq(t).fadeIn().css("margin-right", applyMargin);    
       if (t==(to-1)) {       
        imgref.eq(t).css("margin-right", "0px");
       }
    }
}
/*
 * jQuery UI 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI
 */
jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.3",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(j,k){return this.each(function(){if(!k){if(!j||c.filter(j,[this]).length){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")})}}return i.call(c(this),j,k)})},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/*
 * jQuery UI Draggable 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Draggables
 *
 * Depends:
 *	ui.core.js
 */
(function(a){a.widget("ui.draggable",a.extend({},a.ui.mouse,{_init:function(){if(this.options.helper=="original"&&!(/^(?:r|a|f)/).test(this.element.css("position"))){this.element[0].style.position="relative"}(this.options.addClasses&&this.element.addClass("ui-draggable"));(this.options.disabled&&this.element.addClass("ui-draggable-disabled"));this._mouseInit()},destroy:function(){if(!this.element.data("draggable")){return}this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy()},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")){return false}this.handle=this._getHandle(b);if(!this.handle){return false}return true},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b);this._cacheHelperProportions();if(a.ui.ddmanager){a.ui.ddmanager.current=this}this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(b);this.originalPageX=b.pageX;this.originalPageY=b.pageY;if(c.cursorAt){this._adjustOffsetFromHelper(c.cursorAt)}if(c.containment){this._setContainment()}this._trigger("start",b);this._cacheHelperProportions();if(a.ui.ddmanager&&!c.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,b)}this.helper.addClass("ui-draggable-dragging");this._mouseDrag(b,true);return true},_mouseDrag:function(b,d){this.position=this._generatePosition(b);this.positionAbs=this._convertPositionTo("absolute");if(!d){var c=this._uiHash();this._trigger("drag",b,c);this.position=c.position}if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}if(a.ui.ddmanager){a.ui.ddmanager.drag(this,b)}return false},_mouseStop:function(c){var d=false;if(a.ui.ddmanager&&!this.options.dropBehaviour){d=a.ui.ddmanager.drop(this,c)}if(this.dropped){d=this.dropped;this.dropped=false}if((this.options.revert=="invalid"&&!d)||(this.options.revert=="valid"&&d)||this.options.revert===true||(a.isFunction(this.options.revert)&&this.options.revert.call(this.element,d))){var b=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){b._trigger("stop",c);b._clear()})}else{this._trigger("stop",c);this._clear()}return false},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?true:false;a(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==b.target){c=true}});return c},_createHelper:function(c){var d=this.options;var b=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[c])):(d.helper=="clone"?this.element.clone():this.element);if(!b.parents("body").length){b.appendTo((d.appendTo=="parent"?this.element[0].parentNode:d.appendTo))}if(b[0]!=this.element[0]&&!(/(fixed|absolute)/).test(b.css("position"))){b.css("position","absolute")}return b},_adjustOffsetFromHelper:function(b){if(b.left!=undefined){this.offset.click.left=b.left+this.margins.left}if(b.right!=undefined){this.offset.click.left=this.helperProportions.width-b.right+this.margins.left}if(b.top!=undefined){this.offset.click.top=b.top+this.margins.top}if(b.bottom!=undefined){this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){b.left+=this.scrollParent.scrollLeft();b.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){b={top:0,left:0}}return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var b=this.element.position();return{top:b.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:b.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e=this.options;if(e.containment=="parent"){e.containment=this.helper[0].parentNode}if(e.containment=="document"||e.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(e.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(e.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(e.containment)&&e.containment.constructor!=Array){var c=a(e.containment)[0];if(!c){return}var d=a(e.containment).offset();var b=(a(c).css("overflow")!="hidden");this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(b?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(b?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}else{if(e.containment.constructor==Array){this.containment=e.containment}}},_convertPositionTo:function(f,h){if(!h){h=this.position}var c=f=="absolute"?1:-1;var e=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=(/(html|body)/i).test(b[0].tagName);return{top:(h.top+this.offset.relative.top*c+this.offset.parent.top*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(g?0:b.scrollTop()))*c)),left:(h.left+this.offset.relative.left*c+this.offset.parent.left*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:b.scrollLeft())*c))}},_generatePosition:function(e){var h=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(b[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()}var d=e.pageX;var c=e.pageY;if(this.originalPosition){if(this.containment){if(e.pageX-this.offset.click.left<this.containment[0]){d=this.containment[0]+this.offset.click.left}if(e.pageY-this.offset.click.top<this.containment[1]){c=this.containment[1]+this.offset.click.top}if(e.pageX-this.offset.click.left>this.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:(!(g-this.offset.click.top<this.containment[1])?g-h.grid[1]:g+h.grid[1])):g;var f=this.originalPageX+Math.round((d-this.originalPageX)/h.grid[0])*h.grid[0];d=this.containment?(!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:(!(f-this.offset.click.left<this.containment[0])?f-h.grid[0]:f+h.grid[0])):f}}return{top:(c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(i?0:b.scrollTop())))),left:(d-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:b.scrollLeft())))}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");if(this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval){this.helper.remove()}this.helper=null;this.cancelHelperRemoval=false},_trigger:function(b,c,d){d=d||this._uiHash();a.ui.plugin.call(this,b,[c,d]);if(b=="drag"){this.positionAbs=this._convertPositionTo("absolute")}return a.widget.prototype._trigger.call(this,b,c,d)},plugins:{},_uiHash:function(b){return{helper:this.helper,position:this.position,absolutePosition:this.positionAbs,offset:this.positionAbs}}}));a.extend(a.ui.draggable,{version:"1.7.3",eventPrefix:"drag",defaults:{addClasses:true,appendTo:"parent",axis:false,cancel:":input,option",connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,delay:0,distance:1,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false}});a.ui.plugin.add("draggable","connectToSortable",{start:function(c,e){var d=a(this).data("draggable"),f=d.options,b=a.extend({},e,{item:d.element});d.sortables=[];a(f.connectToSortable).each(function(){var g=a.data(this,"sortable");if(g&&!g.options.disabled){d.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",c,b)}})},stop:function(c,e){var d=a(this).data("draggable"),b=a.extend({},e,{item:d.element});a.each(d.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;d.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert){this.instance.options.revert=true}this.instance._mouseStop(c);this.instance.options.helper=this.instance.options._helper;if(d.options.helper=="original"){this.instance.currentItem.css({top:"auto",left:"auto"})}}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",c,b)}})},drag:function(c,f){var e=a(this).data("draggable"),b=this;var d=function(i){var n=this.offset.click.top,m=this.offset.click.left;var g=this.positionAbs.top,k=this.positionAbs.left;var j=i.height,l=i.width;var p=i.top,h=i.left;return a.ui.isOver(g+n,k+m,p,h,j,l)};a.each(e.sortables,function(g){this.instance.positionAbs=e.positionAbs;this.instance.helperProportions=e.helperProportions;this.instance.offset.click=e.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=a(b).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return f.helper[0]};c.target=this.instance.currentItem[0];this.instance._mouseCapture(c,true);this.instance._mouseStart(c,true,true);this.instance.offset.click.top=e.offset.click.top;this.instance.offset.click.left=e.offset.click.left;this.instance.offset.parent.left-=e.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=e.offset.parent.top-this.instance.offset.parent.top;e._trigger("toSortable",c);e.dropped=this.instance.element;e.currentItem=e.element;this.instance.fromOutside=e}if(this.instance.currentItem){this.instance._mouseDrag(c)}}else{if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",c,this.instance._uiHash(this.instance));this.instance._mouseStop(c,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();if(this.instance.placeholder){this.instance.placeholder.remove()}e._trigger("fromSortable",c);e.dropped=false}}})}});a.ui.plugin.add("draggable","cursor",{start:function(c,d){var b=a("body"),e=a(this).data("draggable").options;if(b.css("cursor")){e._cursor=b.css("cursor")}b.css("cursor",e.cursor)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._cursor){a("body").css("cursor",d._cursor)}}});a.ui.plugin.add("draggable","iframeFix",{start:function(b,c){var d=a(this).data("draggable").options;a(d.iframeFix===true?"iframe":d.iframeFix).each(function(){a('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css(a(this).offset()).appendTo("body")})},stop:function(b,c){a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});a.ui.plugin.add("draggable","opacity",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("opacity")){e._opacity=b.css("opacity")}b.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._opacity){a(c.helper).css("opacity",d._opacity)}}});a.ui.plugin.add("draggable","scroll",{start:function(c,d){var b=a(this).data("draggable");if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){b.overflowOffset=b.scrollParent.offset()}},drag:function(d,e){var c=a(this).data("draggable"),f=c.options,b=false;if(c.scrollParent[0]!=document&&c.scrollParent[0].tagName!="HTML"){if(!f.axis||f.axis!="x"){if((c.overflowOffset.top+c.scrollParent[0].offsetHeight)-d.pageY<f.scrollSensitivity){c.scrollParent[0].scrollTop=b=c.scrollParent[0].scrollTop+f.scrollSpeed}else{if(d.pageY-c.overflowOffset.top<f.scrollSensitivity){c.scrollParent[0].scrollTop=b=c.scrollParent[0].scrollTop-f.scrollSpeed}}}if(!f.axis||f.axis!="y"){if((c.overflowOffset.left+c.scrollParent[0].offsetWidth)-d.pageX<f.scrollSensitivity){c.scrollParent[0].scrollLeft=b=c.scrollParent[0].scrollLeft+f.scrollSpeed}else{if(d.pageX-c.overflowOffset.left<f.scrollSensitivity){c.scrollParent[0].scrollLeft=b=c.scrollParent[0].scrollLeft-f.scrollSpeed}}}}else{if(!f.axis||f.axis!="x"){if(d.pageY-a(document).scrollTop()<f.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()-f.scrollSpeed)}else{if(a(window).height()-(d.pageY-a(document).scrollTop())<f.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()+f.scrollSpeed)}}}if(!f.axis||f.axis!="y"){if(d.pageX-a(document).scrollLeft()<f.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()-f.scrollSpeed)}else{if(a(window).width()-(d.pageX-a(document).scrollLeft())<f.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()+f.scrollSpeed)}}}}if(b!==false&&a.ui.ddmanager&&!f.dropBehaviour){a.ui.ddmanager.prepareOffsets(c,d)}}});a.ui.plugin.add("draggable","snap",{start:function(c,d){var b=a(this).data("draggable"),e=b.options;b.snapElements=[];a(e.snap.constructor!=String?(e.snap.items||":data(draggable)"):e.snap).each(function(){var g=a(this);var f=g.offset();if(this!=b.element[0]){b.snapElements.push({item:this,width:g.outerWidth(),height:g.outerHeight(),top:f.top,left:f.left})}})},drag:function(u,p){var g=a(this).data("draggable"),q=g.options;var y=q.snapTolerance;var x=p.offset.left,w=x+g.helperProportions.width,f=p.offset.top,e=f+g.helperProportions.height;for(var v=g.snapElements.length-1;v>=0;v--){var s=g.snapElements[v].left,n=s+g.snapElements[v].width,m=g.snapElements[v].top,A=m+g.snapElements[v].height;if(!((s-y<x&&x<n+y&&m-y<f&&f<A+y)||(s-y<x&&x<n+y&&m-y<e&&e<A+y)||(s-y<w&&w<n+y&&m-y<f&&f<A+y)||(s-y<w&&w<n+y&&m-y<e&&e<A+y))){if(g.snapElements[v].snapping){(g.options.snap.release&&g.options.snap.release.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=false;continue}if(q.snapMode!="inner"){var c=Math.abs(m-e)<=y;var z=Math.abs(A-f)<=y;var j=Math.abs(s-w)<=y;var k=Math.abs(n-x)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m-g.helperProportions.height,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s-g.helperProportions.width}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n}).left-g.margins.left}}var h=(c||z||j||k);if(q.snapMode!="outer"){var c=Math.abs(m-f)<=y;var z=Math.abs(A-e)<=y;var j=Math.abs(s-x)<=y;var k=Math.abs(n-w)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A-g.helperProportions.height,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n-g.helperProportions.width}).left-g.margins.left}}if(!g.snapElements[v].snapping&&(c||z||j||k||h)){(g.options.snap.snap&&g.options.snap.snap.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=(c||z||j||k||h)}}});a.ui.plugin.add("draggable","stack",{start:function(b,c){var e=a(this).data("draggable").options;var d=a.makeArray(a(e.stack.group)).sort(function(g,f){return(parseInt(a(g).css("zIndex"),10)||e.stack.min)-(parseInt(a(f).css("zIndex"),10)||e.stack.min)});a(d).each(function(f){this.style.zIndex=e.stack.min+f});this[0].style.zIndex=e.stack.min+d.length}});a.ui.plugin.add("draggable","zIndex",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("zIndex")){e._zIndex=b.css("zIndex")}b.css("zIndex",e.zIndex)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._zIndex){a(c.helper).css("zIndex",d._zIndex)}}})})(jQuery);;/*
 * jQuery UI Droppable 1.7.3d
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Droppables
 *
 * Depends:
 *	ui.core.js
 *	ui.draggable.js
 */
(function(a){a.widget("ui.droppable",{_init:function(){var c=this.options,b=c.accept;this.isover=0;this.isout=1;this.options.accept=this.options.accept&&a.isFunction(this.options.accept)?this.options.accept:function(e){return e.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};a.ui.ddmanager.droppables[this.options.scope]=a.ui.ddmanager.droppables[this.options.scope]||[];a.ui.ddmanager.droppables[this.options.scope].push(this);(this.options.addClasses&&this.element.addClass("ui-droppable"))},destroy:function(){var b=a.ui.ddmanager.droppables[this.options.scope];for(var c=0;c<b.length;c++){if(b[c]==this){b.splice(c,1)}}this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable")},_setData:function(b,c){if(b=="accept"){this.options.accept=c&&a.isFunction(c)?c:function(e){return e.is(c)}}else{a.widget.prototype._setData.apply(this,arguments)}},_activate:function(c){var b=a.ui.ddmanager.current;if(this.options.activeClass){this.element.addClass(this.options.activeClass)}(b&&this._trigger("activate",c,this.ui(b)))},_deactivate:function(c){var b=a.ui.ddmanager.current;if(this.options.activeClass){this.element.removeClass(this.options.activeClass)}(b&&this._trigger("deactivate",c,this.ui(b)))},_over:function(c){var b=a.ui.ddmanager.current;if(!b||(b.currentItem||b.element)[0]==this.element[0]){return}if(this.options.accept.call(this.element[0],(b.currentItem||b.element))){if(this.options.hoverClass){this.element.addClass(this.options.hoverClass)}this._trigger("over",c,this.ui(b))}},_out:function(c){var b=a.ui.ddmanager.current;if(!b||(b.currentItem||b.element)[0]==this.element[0]){return}if(this.options.accept.call(this.element[0],(b.currentItem||b.element))){if(this.options.hoverClass){this.element.removeClass(this.options.hoverClass)}this._trigger("out",c,this.ui(b))}},_drop:function(c,d){var b=d||a.ui.ddmanager.current;if(!b||(b.currentItem||b.element)[0]==this.element[0]){return false}var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var f=a.data(this,"droppable");if(f.options.greedy&&a.ui.intersect(b,a.extend(f,{offset:f.element.offset()}),f.options.tolerance)){e=true;return false}});if(e){return false}if(this.options.accept.call(this.element[0],(b.currentItem||b.element))){if(this.options.activeClass){this.element.removeClass(this.options.activeClass)}if(this.options.hoverClass){this.element.removeClass(this.options.hoverClass)}this._trigger("drop",c,this.ui(b));return this.element}return false},ui:function(b){return{draggable:(b.currentItem||b.element),helper:b.helper,position:b.position,absolutePosition:b.positionAbs,offset:b.positionAbs}}});a.extend(a.ui.droppable,{version:"1.7.3",eventPrefix:"drop",defaults:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"}});a.ui.intersect=function(q,j,o){if(!j.offset){return false}var e=(q.positionAbs||q.position.absolute).left,d=e+q.helperProportions.width,n=(q.positionAbs||q.position.absolute).top,m=n+q.helperProportions.height;var g=j.offset.left,c=g+j.proportions.width,p=j.offset.top,k=p+j.proportions.height;switch(o){case"fit":return(g<e&&d<c&&p<n&&m<k);break;case"intersect":return(g<e+(q.helperProportions.width/2)&&d-(q.helperProportions.width/2)<c&&p<n+(q.helperProportions.height/2)&&m-(q.helperProportions.height/2)<k);break;case"pointer":var h=((q.positionAbs||q.position.absolute).left+(q.clickOffset||q.offset.click).left),i=((q.positionAbs||q.position.absolute).top+(q.clickOffset||q.offset.click).top),f=a.ui.isOver(i,h,p,g,j.proportions.height,j.proportions.width);return f;break;case"touch":return((n>=p&&n<=k)||(m>=p&&m<=k)||(n<p&&m>k))&&((e>=g&&e<=c)||(d>=g&&d<=c)||(e<g&&d>c));break;default:return false;break}};a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,g){var b=a.ui.ddmanager.droppables[e.options.scope];var f=g?g.type:null;var h=(e.currentItem||e.element).find(":data(droppable)").andSelf();droppablesLoop:for(var d=0;d<b.length;d++){if(b[d].options.disabled||(e&&!b[d].options.accept.call(b[d].element[0],(e.currentItem||e.element)))){continue}for(var c=0;c<h.length;c++){if(h[c]==b[d].element[0]){b[d].proportions.height=0;continue droppablesLoop}}b[d].visible=b[d].element.css("display")!="none";if(!b[d].visible){continue}b[d].offset=b[d].element.offset();b[d].proportions={width:b[d].element[0].offsetWidth,height:b[d].element[0].offsetHeight};if(f=="mousedown"){b[d]._activate.call(b[d],g)}}},drop:function(b,c){var d=false;a.each(a.ui.ddmanager.droppables[b.options.scope],function(){if(!this.options){return}if(!this.options.disabled&&this.visible&&a.ui.intersect(b,this,this.options.tolerance)){d=this._drop.call(this,c)}if(!this.options.disabled&&this.visible&&this.options.accept.call(this.element[0],(b.currentItem||b.element))){this.isout=1;this.isover=0;this._deactivate.call(this,c)}});return d},drag:function(b,c){if(b.options.refreshPositions){a.ui.ddmanager.prepareOffsets(b,c)}a.each(a.ui.ddmanager.droppables[b.options.scope],function(){if(this.options.disabled||this.greedyChild||!this.visible){return}var e=a.ui.intersect(b,this,this.options.tolerance);var g=!e&&this.isover==1?"isout":(e&&this.isover==0?"isover":null);if(!g){return}var f;if(this.options.greedy){var d=this.element.parents(":data(droppable):eq(0)");if(d.length){f=a.data(d[0],"droppable");f.greedyChild=(g=="isover"?1:0)}}if(f&&g=="isover"){f.isover=0;f.isout=1;f._out.call(f,c)}this[g]=1;this[g=="isout"?"isover":"isout"]=0;this[g=="isover"?"_over":"_out"].call(this,c);if(f&&g=="isout"){f.isout=0;f.isover=1;f._over.call(f,c)}})}}})(jQuery);;/*
 * jQuery UI Resizable 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Resizables
 *
 * Depends:
 *	ui.core.js
 */
(function(c){c.widget("ui.resizable",c.extend({},c.ui.mouse,{_init:function(){var e=this,j=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(j.aspectRatio),aspectRatio:j.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:j.helper||j.ghost||j.animate?j.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){if(/relative/.test(this.element.css("position"))&&c.browser.opera){this.element.css({position:"relative",top:"auto",left:"auto"})}this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=j.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var k=this.handles.split(",");this.handles={};for(var f=0;f<k.length;f++){var h=c.trim(k[f]),d="ui-resizable-"+h;var g=c('<div class="ui-resizable-handle '+d+'"></div>');if(/sw|se|ne|nw/.test(h)){g.css({zIndex:++j.zIndex})}if("se"==h){g.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[h]=".ui-resizable-"+h;this.element.append(g)}}this._renderAxis=function(p){p=p||this.element;for(var m in this.handles){if(this.handles[m].constructor==String){this.handles[m]=c(this.handles[m],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var n=c(this.handles[m],this.element),o=0;o=/sw|ne|nw|se|n|s/.test(m)?n.outerHeight():n.outerWidth();var l=["padding",/ne|nw|n/.test(m)?"Top":/se|sw|s/.test(m)?"Bottom":/^e$/.test(m)?"Right":"Left"].join("");p.css(l,o);this._proportionallyResize()}if(!c(this.handles[m]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!e.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}e.axis=i&&i[1]?i[1]:"se"}});if(j.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){c(this).removeClass("ui-resizable-autohide");e._handles.show()},function(){if(!e.resizing){c(this).addClass("ui-resizable-autohide");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var d=function(f){c(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){d(this.element);var e=this.element;e.parent().append(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).end().remove()}this.originalElement.css("resize",this.originalResizeStyle);d(this.originalElement)},_mouseCapture:function(e){var f=false;for(var d in this.handles){if(c(this.handles[d])[0]==e.target){f=true}}return this.options.disabled||!!f},_mouseStart:function(f){var i=this.options,e=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(d.is(".ui-draggable")||(/absolute/).test(d.css("position"))){d.css({position:"absolute",top:e.top,left:e.left})}if(c.browser.opera&&(/relative/).test(d.css("position"))){d.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var j=b(this.helper.css("left")),g=b(this.helper.css("top"));if(i.containment){j+=c(i.containment).scrollLeft()||0;g+=c(i.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:j,top:g};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:j,top:g};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:f.pageX,top:f.pageY};this.aspectRatio=(typeof i.aspectRatio=="number")?i.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var h=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",h=="auto"?this.axis+"-resize":h);d.addClass("ui-resizable-resizing");this._propagate("start",f);return true},_mouseDrag:function(d){var g=this.helper,f=this.options,l={},p=this,i=this.originalMousePosition,m=this.axis;var q=(d.pageX-i.left)||0,n=(d.pageY-i.top)||0;var h=this._change[m];if(!h){return false}var k=h.apply(this,[d,q,n]),j=c.browser.msie&&c.browser.version<7,e=this.sizeDiff;if(this._aspectRatio||d.shiftKey){k=this._updateRatio(k,d)}k=this._respectSize(k,d);this._propagate("resize",d);g.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(k);this._trigger("resize",d,this.ui());return false},_mouseStop:function(g){this.resizing=false;var h=this.options,l=this;if(this._helper){var f=this._proportionallyResizeElements,d=f.length&&(/textarea/i).test(f[0].nodeName),e=d&&c.ui.hasScroll(f[0],"left")?0:l.sizeDiff.height,j=d?0:l.sizeDiff.width;var m={width:(l.size.width-j),height:(l.size.height-e)},i=(parseInt(l.element.css("left"),10)+(l.position.left-l.originalPosition.left))||null,k=(parseInt(l.element.css("top"),10)+(l.position.top-l.originalPosition.top))||null;if(!h.animate){this.element.css(c.extend(m,{top:k,left:i}))}l.helper.height(l.size.height);l.helper.width(l.size.width);if(this._helper&&!h.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",g);if(this._helper){this.helper.remove()}return false},_updateCache:function(d){var e=this.options;this.offset=this.helper.offset();if(a(d.left)){this.position.left=d.left}if(a(d.top)){this.position.top=d.top}if(a(d.height)){this.size.height=d.height}if(a(d.width)){this.size.width=d.width}},_updateRatio:function(g,f){var h=this.options,i=this.position,e=this.size,d=this.axis;if(g.height){g.width=(e.height*this.aspectRatio)}else{if(g.width){g.height=(e.width/this.aspectRatio)}}if(d=="sw"){g.left=i.left+(e.width-g.width);g.top=null}if(d=="nw"){g.top=i.top+(e.height-g.height);g.left=i.left+(e.width-g.width)}return g},_respectSize:function(k,f){var i=this.helper,h=this.options,q=this._aspectRatio||f.shiftKey,p=this.axis,s=a(k.width)&&h.maxWidth&&(h.maxWidth<k.width),l=a(k.height)&&h.maxHeight&&(h.maxHeight<k.height),g=a(k.width)&&h.minWidth&&(h.minWidth>k.width),r=a(k.height)&&h.minHeight&&(h.minHeight>k.height);if(g){k.width=h.minWidth}if(r){k.height=h.minHeight}if(s){k.width=h.maxWidth}if(l){k.height=h.maxHeight}var e=this.originalPosition.left+this.originalSize.width,n=this.position.top+this.size.height;var j=/sw|nw|w/.test(p),d=/nw|ne|n/.test(p);if(g&&j){k.left=e-h.minWidth}if(s&&j){k.left=e-h.maxWidth}if(r&&d){k.top=n-h.minHeight}if(l&&d){k.top=n-h.maxHeight}var m=!k.width&&!k.height;if(m&&!k.left&&k.top){k.top=null}else{if(m&&!k.top&&k.left){k.left=null}}return k},_proportionallyResize:function(){var j=this.options;if(!this._proportionallyResizeElements.length){return}var f=this.helper||this.element;for(var e=0;e<this._proportionallyResizeElements.length;e++){var g=this._proportionallyResizeElements[e];if(!this.borderDif){var d=[g.css("borderTopWidth"),g.css("borderRightWidth"),g.css("borderBottomWidth"),g.css("borderLeftWidth")],h=[g.css("paddingTop"),g.css("paddingRight"),g.css("paddingBottom"),g.css("paddingLeft")];this.borderDif=c.map(d,function(k,m){var l=parseInt(k,10)||0,n=parseInt(h[m],10)||0;return l+n})}if(c.browser.msie&&!(!(c(f).is(":hidden")||c(f).parents(":hidden").length))){continue}g.css({height:(f.height()-this.borderDif[0]-this.borderDif[2])||0,width:(f.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var e=this.element,h=this.options;this.elementOffset=e.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++h.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!="resize"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));c.extend(c.ui.resizable,{version:"1.7.3",eventPrefix:"resize",defaults:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,cancel:":input,option",containment:false,delay:0,distance:1,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000}});c.ui.plugin.add("resizable","alsoResize",{start:function(e,f){var d=c(this).data("resizable"),g=d.options;_store=function(h){c(h).each(function(){c(this).data("resizable-alsoresize",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css("left"),10),top:parseInt(c(this).css("top"),10)})})};if(typeof(g.alsoResize)=="object"&&!g.alsoResize.parentNode){if(g.alsoResize.length){g.alsoResize=g.alsoResize[0];_store(g.alsoResize)}else{c.each(g.alsoResize,function(h,i){_store(h)})}}else{_store(g.alsoResize)}},resize:function(f,h){var e=c(this).data("resizable"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data("resizable-alsoresize"),o={},n=m&&m.length?m:["width","height","top","left"];c.each(n||["width","height","top","left"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css("position"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:"absolute",top:"auto",left:"auto"})}p.css(o)})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data("resizable");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:"relative"})}c(this).removeData("resizable-alsoresize-start")}});c.ui.plugin.add("resizable","animate",{stop:function(h,m){var n=c(this).data("resizable"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],"left")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate("resize",h)}})}});c.ui.plugin.add("resizable","containment",{start:function(e,q){var s=c(this).data("resizable"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){h[p]=b(m.css("padding"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,"left")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data("resizable"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css("position"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0)){s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css("position"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data("resizable"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add("resizable","ghost",{start:function(f,g){var d=c(this).data("resizable"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost){d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(d,l){var n=c(this).data("resizable"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid=="number"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);;/*
 * jQuery UI Selectable 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Selectables
 *
 * Depends:
 *	ui.core.js
 */
(function(a){a.widget("ui.selectable",a.extend({},a.ui.mouse,{_init:function(){var b=this;this.element.addClass("ui-selectable");this.dragged=false;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]);c.each(function(){var d=a(this);var e=d.offset();a.data(this,"selectable-item",{element:this,$element:d,left:e.left,top:e.top,right:e.left+d.outerWidth(),bottom:e.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=c.addClass("ui-selectee");this._mouseInit();this.helper=a(document.createElement("div")).css({border:"1px dotted black"}).addClass("ui-selectable-helper")},destroy:function(){this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy()},_mouseStart:function(d){var b=this;this.opos=[d.pageX,d.pageY];if(this.options.disabled){return}var c=this.options;this.selectees=a(c.filter,this.element[0]);this._trigger("start",d);a(c.appendTo).append(this.helper);this.helper.css({"z-index":100,position:"absolute",left:d.clientX,top:d.clientY,width:0,height:0});if(c.autoRefresh){this.refresh()}this.selectees.filter(".ui-selected").each(function(){var e=a.data(this,"selectable-item");e.startselected=true;if(!d.metaKey){e.$element.removeClass("ui-selected");e.selected=false;e.$element.addClass("ui-unselecting");e.unselecting=true;b._trigger("unselecting",d,{unselecting:e.element})}});a(d.target).parents().andSelf().each(function(){var e=a.data(this,"selectable-item");if(e){e.$element.removeClass("ui-unselecting").addClass("ui-selecting");e.unselecting=false;e.selecting=true;e.selected=true;b._trigger("selecting",d,{selecting:e.element});return false}})},_mouseDrag:function(i){var c=this;this.dragged=true;if(this.options.disabled){return}var e=this.options;var d=this.opos[0],h=this.opos[1],b=i.pageX,g=i.pageY;if(d>b){var f=b;b=d;d=f}if(h>g){var f=g;g=h;h=f}this.helper.css({left:d,top:h,width:b-d,height:g-h});this.selectees.each(function(){var j=a.data(this,"selectable-item");if(!j||j.element==c.element[0]){return}var k=false;if(e.tolerance=="touch"){k=(!(j.left>b||j.right<d||j.top>g||j.bottom<h))}else{if(e.tolerance=="fit"){k=(j.left>d&&j.right<b&&j.top>h&&j.bottom<g)}}if(k){if(j.selected){j.$element.removeClass("ui-selected");j.selected=false}if(j.unselecting){j.$element.removeClass("ui-unselecting");j.unselecting=false}if(!j.selecting){j.$element.addClass("ui-selecting");j.selecting=true;c._trigger("selecting",i,{selecting:j.element})}}else{if(j.selecting){if(i.metaKey&&j.startselected){j.$element.removeClass("ui-selecting");j.selecting=false;j.$element.addClass("ui-selected");j.selected=true}else{j.$element.removeClass("ui-selecting");j.selecting=false;if(j.startselected){j.$element.addClass("ui-unselecting");j.unselecting=true}c._trigger("unselecting",i,{unselecting:j.element})}}if(j.selected){if(!i.metaKey&&!j.startselected){j.$element.removeClass("ui-selected");j.selected=false;j.$element.addClass("ui-unselecting");j.unselecting=true;c._trigger("unselecting",i,{unselecting:j.element})}}}});return false},_mouseStop:function(d){var b=this;this.dragged=false;var c=this.options;a(".ui-unselecting",this.element[0]).each(function(){var e=a.data(this,"selectable-item");e.$element.removeClass("ui-unselecting");e.unselecting=false;e.startselected=false;b._trigger("unselected",d,{unselected:e.element})});a(".ui-selecting",this.element[0]).each(function(){var e=a.data(this,"selectable-item");e.$element.removeClass("ui-selecting").addClass("ui-selected");e.selecting=false;e.selected=true;e.startselected=true;b._trigger("selected",d,{selected:e.element})});this._trigger("stop",d);this.helper.remove();return false}}));a.extend(a.ui.selectable,{version:"1.7.3",defaults:{appendTo:"body",autoRefresh:true,cancel:":input,option",delay:0,distance:0,filter:"*",tolerance:"touch"}})})(jQuery);;/*
 * jQuery UI Sortable 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Sortables
 *
 * Depends:
 *	ui.core.js
 */
(function(a){a.widget("ui.sortable",a.extend({},a.ui.mouse,{_init:function(){var b=this.options;this.containerCache={};this.element.addClass("ui-sortable");this.refresh();this.floating=this.items.length?(/left|right/).test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--){this.items[b].item.removeData("sortable-item")}},_mouseCapture:function(e,f){if(this.reverting){return false}if(this.options.disabled||this.options.type=="static"){return false}this._refreshItems(e);var d=null,c=this,b=a(e.target).parents().each(function(){if(a.data(this,"sortable-item")==c){d=a(this);return false}});if(a.data(e.target,"sortable-item")==c){d=a(e.target)}if(!d){return false}if(this.options.handle&&!f){var g=false;a(this.options.handle,d).find("*").andSelf().each(function(){if(this==e.target){g=true}});if(!g){return false}}this.currentItem=d;this._removeCurrentsFromItems();return true},_mouseStart:function(e,f,b){var g=this.options,c=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(e);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");a.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(e);this.originalPageX=e.pageX;this.originalPageY=e.pageY;if(g.cursorAt){this._adjustOffsetFromHelper(g.cursorAt)}this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};if(this.helper[0]!=this.currentItem[0]){this.currentItem.hide()}this._createPlaceholder();if(g.containment){this._setContainment()}if(g.cursor){if(a("body").css("cursor")){this._storedCursor=a("body").css("cursor")}a("body").css("cursor",g.cursor)}if(g.opacity){if(this.helper.css("opacity")){this._storedOpacity=this.helper.css("opacity")}this.helper.css("opacity",g.opacity)}if(g.zIndex){if(this.helper.css("zIndex")){this._storedZIndex=this.helper.css("zIndex")}this.helper.css("zIndex",g.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){this.overflowOffset=this.scrollParent.offset()}this._trigger("start",e,this._uiHash());if(!this._preserveHelperProportions){this._cacheHelperProportions()}if(!b){for(var d=this.containers.length-1;d>=0;d--){this.containers[d]._trigger("activate",e,c._uiHash(this))}}if(a.ui.ddmanager){a.ui.ddmanager.current=this}if(a.ui.ddmanager&&!g.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,e)}this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(e);return true},_mouseDrag:function(f){this.position=this._generatePosition(f);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs){this.lastPositionAbs=this.positionAbs}if(this.options.scroll){var g=this.options,b=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if((this.overflowOffset.top+this.scrollParent[0].offsetHeight)-f.pageY<g.scrollSensitivity){this.scrollParent[0].scrollTop=b=this.scrollParent[0].scrollTop+g.scrollSpeed}else{if(f.pageY-this.overflowOffset.top<g.scrollSensitivity){this.scrollParent[0].scrollTop=b=this.scrollParent[0].scrollTop-g.scrollSpeed}}if((this.overflowOffset.left+this.scrollParent[0].offsetWidth)-f.pageX<g.scrollSensitivity){this.scrollParent[0].scrollLeft=b=this.scrollParent[0].scrollLeft+g.scrollSpeed}else{if(f.pageX-this.overflowOffset.left<g.scrollSensitivity){this.scrollParent[0].scrollLeft=b=this.scrollParent[0].scrollLeft-g.scrollSpeed}}}else{if(f.pageY-a(document).scrollTop()<g.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()-g.scrollSpeed)}else{if(a(window).height()-(f.pageY-a(document).scrollTop())<g.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()+g.scrollSpeed)}}if(f.pageX-a(document).scrollLeft()<g.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()-g.scrollSpeed)}else{if(a(window).width()-(f.pageX-a(document).scrollLeft())<g.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()+g.scrollSpeed)}}}if(b!==false&&a.ui.ddmanager&&!g.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,f)}}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}for(var d=this.items.length-1;d>=0;d--){var e=this.items[d],c=e.item[0],h=this._intersectsWithPointer(e);if(!h){continue}if(c!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=c&&!a.ui.contains(this.placeholder[0],c)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],c):true)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(e)){this._rearrange(f,e)}else{break}this._trigger("change",f,this._uiHash());break}}this._contactContainers(f);if(a.ui.ddmanager){a.ui.ddmanager.drag(this,f)}this._trigger("sort",f,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(c,d){if(!c){return}if(a.ui.ddmanager&&!this.options.dropBehaviour){a.ui.ddmanager.drop(this,c)}if(this.options.revert){var b=this;var e=b.placeholder.offset();b.reverting=true;a(this.helper).animate({left:e.left-this.offset.parent.left-b.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-b.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){b._clear(c)})}else{this._clear(c,d)}return false},cancel:function(){var b=this;if(this.dragging){this._mouseUp();if(this.options.helper=="original"){this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else{this.currentItem.show()}for(var c=this.containers.length-1;c>=0;c--){this.containers[c]._trigger("deactivate",null,b._uiHash(this));if(this.containers[c].containerCache.over){this.containers[c]._trigger("out",null,b._uiHash(this));this.containers[c].containerCache.over=0}}}if(this.placeholder[0].parentNode){this.placeholder[0].parentNode.removeChild(this.placeholder[0])}if(this.options.helper!="original"&&this.helper&&this.helper[0].parentNode){this.helper.remove()}a.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});if(this.domPosition.prev){a(this.domPosition.prev).after(this.currentItem)}else{a(this.domPosition.parent).prepend(this.currentItem)}return true},serialize:function(d){var b=this._getItemsAsjQuery(d&&d.connected);var c=[];d=d||{};a(b).each(function(){var e=(a(d.item||this).attr(d.attribute||"id")||"").match(d.expression||(/(.+)[-=_](.+)/));if(e){c.push((d.key||e[1]+"[]")+"="+(d.key&&d.expression?e[1]:e[2]))}});return c.join("&")},toArray:function(d){var b=this._getItemsAsjQuery(d&&d.connected);var c=[];d=d||{};b.each(function(){c.push(a(d.item||this).attr(d.attribute||"id")||"")});return c},_intersectsWith:function(m){var e=this.positionAbs.left,d=e+this.helperProportions.width,k=this.positionAbs.top,j=k+this.helperProportions.height;var f=m.left,c=f+m.width,n=m.top,i=n+m.height;var o=this.offset.click.top,h=this.offset.click.left;var g=(k+o)>n&&(k+o)<i&&(e+h)>f&&(e+h)<c;if(this.options.tolerance=="pointer"||this.options.forcePointerForContainers||(this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>m[this.floating?"width":"height"])){return g}else{return(f<e+(this.helperProportions.width/2)&&d-(this.helperProportions.width/2)<c&&n<k+(this.helperProportions.height/2)&&j-(this.helperProportions.height/2)<i)}},_intersectsWithPointer:function(d){var e=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,d.top,d.height),c=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,d.left,d.width),g=e&&c,b=this._getDragVerticalDirection(),f=this._getDragHorizontalDirection();if(!g){return false}return this.floating?(((f&&f=="right")||b=="down")?2:1):(b&&(b=="down"?2:1))},_intersectsWithSides:function(e){var c=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+(e.height/2),e.height),d=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+(e.width/2),e.width),b=this._getDragVerticalDirection(),f=this._getDragHorizontalDirection();if(this.floating&&f){return((f=="right"&&d)||(f=="left"&&!d))}else{return b&&((b=="down"&&c)||(b=="up"&&!c))}},_getDragVerticalDirection:function(){var b=this.positionAbs.top-this.lastPositionAbs.top;return b!=0&&(b>0?"down":"up")},_getDragHorizontalDirection:function(){var b=this.positionAbs.left-this.lastPositionAbs.left;return b!=0&&(b>0?"right":"left")},refresh:function(b){this._refreshItems(b);this.refreshPositions()},_connectWith:function(){var b=this.options;return b.connectWith.constructor==String?[b.connectWith]:b.connectWith},_getItemsAsjQuery:function(b){var l=this;var g=[];var e=[];var h=this._connectWith();if(h&&b){for(var d=h.length-1;d>=0;d--){var k=a(h[d]);for(var c=k.length-1;c>=0;c--){var f=a.data(k[c],"sortable");if(f&&f!=this&&!f.options.disabled){e.push([a.isFunction(f.options.items)?f.options.items.call(f.element):a(f.options.items,f.element).not(".ui-sortable-helper"),f])}}}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper"),this]);for(var d=e.length-1;d>=0;d--){e[d][0].each(function(){g.push(this)})}return a(g)},_removeCurrentsFromItems:function(){var d=this.currentItem.find(":data(sortable-item)");for(var c=0;c<this.items.length;c++){for(var b=0;b<d.length;b++){if(d[b]==this.items[c].item[0]){this.items.splice(c,1)}}}},_refreshItems:function(b){this.items=[];this.containers=[this];var h=this.items;var p=this;var f=[[a.isFunction(this.options.items)?this.options.items.call(this.element[0],b,{item:this.currentItem}):a(this.options.items,this.element),this]];var l=this._connectWith();if(l){for(var e=l.length-1;e>=0;e--){var m=a(l[e]);for(var d=m.length-1;d>=0;d--){var g=a.data(m[d],"sortable");if(g&&g!=this&&!g.options.disabled){f.push([a.isFunction(g.options.items)?g.options.items.call(g.element[0],b,{item:this.currentItem}):a(g.options.items,g.element),g]);this.containers.push(g)}}}}for(var e=f.length-1;e>=0;e--){var k=f[e][1];var c=f[e][0];for(var d=0,n=c.length;d<n;d++){var o=a(c[d]);o.data("sortable-item",k);h.push({item:o,instance:k,width:0,height:0,left:0,top:0})}}},refreshPositions:function(b){if(this.offsetParent&&this.helper){this.offset.parent=this._getParentOffset()}for(var d=this.items.length-1;d>=0;d--){var e=this.items[d];if(e.instance!=this.currentContainer&&this.currentContainer&&e.item[0]!=this.currentItem[0]){continue}var c=this.options.toleranceElement?a(this.options.toleranceElement,e.item):e.item;if(!b){e.width=c.outerWidth();e.height=c.outerHeight()}var f=c.offset();e.left=f.left;e.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers){this.options.custom.refreshContainers.call(this)}else{for(var d=this.containers.length-1;d>=0;d--){var f=this.containers[d].element.offset();this.containers[d].containerCache.left=f.left;this.containers[d].containerCache.top=f.top;this.containers[d].containerCache.width=this.containers[d].element.outerWidth();this.containers[d].containerCache.height=this.containers[d].element.outerHeight()}}},_createPlaceholder:function(d){var b=d||this,e=b.options;if(!e.placeholder||e.placeholder.constructor==String){var c=e.placeholder;e.placeholder={element:function(){var f=a(document.createElement(b.currentItem[0].nodeName)).addClass(c||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!c){f.style.visibility="hidden"}return f},update:function(f,g){if(c&&!e.forcePlaceholderSize){return}if(!g.height()){g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10))}if(!g.width()){g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=a(e.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);e.placeholder.update(b,b.placeholder)},_contactContainers:function(d){for(var c=this.containers.length-1;c>=0;c--){if(this._intersectsWith(this.containers[c].containerCache)){if(!this.containers[c].containerCache.over){if(this.currentContainer!=this.containers[c]){var h=10000;var g=null;var e=this.positionAbs[this.containers[c].floating?"left":"top"];for(var b=this.items.length-1;b>=0;b--){if(!a.ui.contains(this.containers[c].element[0],this.items[b].item[0])){continue}var f=this.items[b][this.containers[c].floating?"left":"top"];if(Math.abs(f-e)<h){h=Math.abs(f-e);g=this.items[b]}}if(!g&&!this.options.dropOnEmpty){continue}this.currentContainer=this.containers[c];g?this._rearrange(d,g,null,true):this._rearrange(d,null,this.containers[c].element,true);this._trigger("change",d,this._uiHash());this.containers[c]._trigger("change",d,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder)}this.containers[c]._trigger("over",d,this._uiHash(this));this.containers[c].containerCache.over=1}}else{if(this.containers[c].containerCache.over){this.containers[c]._trigger("out",d,this._uiHash(this));this.containers[c].containerCache.over=0}}}},_createHelper:function(c){var d=this.options;var b=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[c,this.currentItem])):(d.helper=="clone"?this.currentItem.clone():this.currentItem);if(!b.parents("body").length){a(d.appendTo!="parent"?d.appendTo:this.currentItem[0].parentNode)[0].appendChild(b[0])}if(b[0]==this.currentItem[0]){this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}}if(b[0].style.width==""||d.forceHelperSize){b.width(this.currentItem.width())}if(b[0].style.height==""||d.forceHelperSize){b.height(this.currentItem.height())}return b},_adjustOffsetFromHelper:function(b){if(b.left!=undefined){this.offset.click.left=b.left+this.margins.left}if(b.right!=undefined){this.offset.click.left=this.helperProportions.width-b.right+this.margins.left}if(b.top!=undefined){this.offset.click.top=b.top+this.margins.top}if(b.bottom!=undefined){this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){b.left+=this.scrollParent.scrollLeft();b.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){b={top:0,left:0}}return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var b=this.currentItem.position();return{top:b.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:b.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.currentItem.css("marginLeft"),10)||0),top:(parseInt(this.currentItem.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e=this.options;if(e.containment=="parent"){e.containment=this.helper[0].parentNode}if(e.containment=="document"||e.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(e.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(e.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(e.containment)){var c=a(e.containment)[0];var d=a(e.containment).offset();var b=(a(c).css("overflow")!="hidden");this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(b?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(b?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(f,h){if(!h){h=this.position}var c=f=="absolute"?1:-1;var e=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=(/(html|body)/i).test(b[0].tagName);return{top:(h.top+this.offset.relative.top*c+this.offset.parent.top*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(g?0:b.scrollTop()))*c)),left:(h.left+this.offset.relative.left*c+this.offset.parent.left*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:b.scrollLeft())*c))}},_generatePosition:function(e){var h=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(b[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()}var d=e.pageX;var c=e.pageY;if(this.originalPosition){if(this.containment){if(e.pageX-this.offset.click.left<this.containment[0]){d=this.containment[0]+this.offset.click.left}if(e.pageY-this.offset.click.top<this.containment[1]){c=this.containment[1]+this.offset.click.top}if(e.pageX-this.offset.click.left>this.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:(!(g-this.offset.click.top<this.containment[1])?g-h.grid[1]:g+h.grid[1])):g;var f=this.originalPageX+Math.round((d-this.originalPageX)/h.grid[0])*h.grid[0];d=this.containment?(!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:(!(f-this.offset.click.left<this.containment[0])?f-h.grid[0]:f+h.grid[0])):f}}return{top:(c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(i?0:b.scrollTop())))),left:(d-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:b.scrollLeft())))}},_rearrange:function(g,f,c,e){c?c[0].appendChild(this.placeholder[0]):f.item[0].parentNode.insertBefore(this.placeholder[0],(this.direction=="down"?f.item[0]:f.item[0].nextSibling));this.counter=this.counter?++this.counter:1;var d=this,b=this.counter;window.setTimeout(function(){if(b==d.counter){d.refreshPositions(!e)}},0)},_clear:function(d,e){this.reverting=false;var f=[],b=this;if(!this._noFinalSort&&this.currentItem[0].parentNode){this.placeholder.before(this.currentItem)}this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var c in this._storedCSS){if(this._storedCSS[c]=="auto"||this._storedCSS[c]=="static"){this._storedCSS[c]=""}}this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else{this.currentItem.show()}if(this.fromOutside&&!e){f.push(function(g){this._trigger("receive",g,this._uiHash(this.fromOutside))})}if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!e){f.push(function(g){this._trigger("update",g,this._uiHash())})}if(!a.ui.contains(this.element[0],this.currentItem[0])){if(!e){f.push(function(g){this._trigger("remove",g,this._uiHash())})}for(var c=this.containers.length-1;c>=0;c--){if(a.ui.contains(this.containers[c].element[0],this.currentItem[0])&&!e){f.push((function(g){return function(h){g._trigger("receive",h,this._uiHash(this))}}).call(this,this.containers[c]));f.push((function(g){return function(h){g._trigger("update",h,this._uiHash(this))}}).call(this,this.containers[c]))}}}for(var c=this.containers.length-1;c>=0;c--){if(!e){f.push((function(g){return function(h){g._trigger("deactivate",h,this._uiHash(this))}}).call(this,this.containers[c]))}if(this.containers[c].containerCache.over){f.push((function(g){return function(h){g._trigger("out",h,this._uiHash(this))}}).call(this,this.containers[c]));this.containers[c].containerCache.over=0}}if(this._storedCursor){a("body").css("cursor",this._storedCursor)}if(this._storedOpacity){this.helper.css("opacity",this._storedOpacity)}if(this._storedZIndex){this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex)}this.dragging=false;if(this.cancelHelperRemoval){if(!e){this._trigger("beforeStop",d,this._uiHash());for(var c=0;c<f.length;c++){f[c].call(this,d)}this._trigger("stop",d,this._uiHash())}return false}if(!e){this._trigger("beforeStop",d,this._uiHash())}this.placeholder[0].parentNode.removeChild(this.placeholder[0]);if(this.helper[0]!=this.currentItem[0]){this.helper.remove()}this.helper=null;if(!e){for(var c=0;c<f.length;c++){f[c].call(this,d)}this._trigger("stop",d,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){if(a.widget.prototype._trigger.apply(this,arguments)===false){this.cancel()}},_uiHash:function(c){var b=c||this;return{helper:b.helper,placeholder:b.placeholder||a([]),position:b.position,absolutePosition:b.positionAbs,offset:b.positionAbs,item:b.currentItem,sender:c?c.element:null}}}));a.extend(a.ui.sortable,{getter:"serialize toArray",version:"1.7.3",eventPrefix:"sort",defaults:{appendTo:"parent",axis:false,cancel:":input,option",connectWith:false,containment:false,cursor:"auto",cursorAt:false,delay:0,distance:1,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1000}})})(jQuery);;/*
 * jQuery UI Accordion 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Accordion
 *
 * Depends:
 *	ui.core.js
 */
(function(a){a.widget("ui.accordion",{_init:function(){var d=this.options,b=this;this.running=0;if(d.collapsible==a.ui.accordion.defaults.collapsible&&d.alwaysOpen!=a.ui.accordion.defaults.alwaysOpen){d.collapsible=!d.alwaysOpen}if(d.navigation){var c=this.element.find("a").filter(d.navigationFilter);if(c.length){if(c.filter(d.header).length){this.active=c}else{this.active=c.parent().parent().prev();c.addClass("ui-accordion-content-active")}}}this.element.addClass("ui-accordion ui-widget ui-helper-reset");if(this.element[0].nodeName=="UL"){this.element.children("li").addClass("ui-accordion-li-fix")}this.headers=this.element.find(d.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){a(this).removeClass("ui-state-focus")});this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");this.active=this._findActive(this.active||d.active).toggleClass("ui-state-default").toggleClass("ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");this.active.next().addClass("ui-accordion-content-active");a("<span/>").addClass("ui-icon "+d.icons.header).prependTo(this.headers);this.active.find(".ui-icon").toggleClass(d.icons.header).toggleClass(d.icons.headerSelected);if(a.browser.msie){this.element.find("a").css("zoom","1")}this.resize();this.element.attr("role","tablist");this.headers.attr("role","tab").bind("keydown",function(e){return b._keydown(e)}).next().attr("role","tabpanel");this.headers.not(this.active||"").attr("aria-expanded","false").attr("tabIndex","-1").next().hide();if(!this.active.length){this.headers.eq(0).attr("tabIndex","0")}else{this.active.attr("aria-expanded","true").attr("tabIndex","0")}if(!a.browser.safari){this.headers.find("a").attr("tabIndex","-1")}if(d.event){this.headers.bind((d.event)+".accordion",function(e){return b._clickHandler.call(b,e,this)})}},destroy:function(){var c=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role").unbind(".accordion").removeData("accordion");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabindex");this.headers.find("a").removeAttr("tabindex");this.headers.children(".ui-icon").remove();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active");if(c.autoHeight||c.fillHeight){b.css("height","")}},_setData:function(b,c){if(b=="alwaysOpen"){b="collapsible";c=!c}a.widget.prototype._setData.apply(this,arguments)},_keydown:function(e){var g=this.options,f=a.ui.keyCode;if(g.disabled||e.altKey||e.ctrlKey){return}var d=this.headers.length;var b=this.headers.index(e.target);var c=false;switch(e.keyCode){case f.RIGHT:case f.DOWN:c=this.headers[(b+1)%d];break;case f.LEFT:case f.UP:c=this.headers[(b-1+d)%d];break;case f.SPACE:case f.ENTER:return this._clickHandler({target:e.target},e.target)}if(c){a(e.target).attr("tabIndex","-1");a(c).attr("tabIndex","0");c.focus();return false}return true},resize:function(){var e=this.options,d;if(e.fillSpace){if(a.browser.msie){var b=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}d=this.element.parent().height();if(a.browser.msie){this.element.parent().css("overflow",b)}this.headers.each(function(){d-=a(this).outerHeight()});var c=0;this.headers.next().each(function(){c=Math.max(c,a(this).innerHeight()-a(this).height())}).height(Math.max(0,d-c)).css("overflow","auto")}else{if(e.autoHeight){d=0;this.headers.next().each(function(){d=Math.max(d,a(this).outerHeight())}).height(d)}}},activate:function(b){var c=this._findActive(b)[0];this._clickHandler({target:c},c)},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===false?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(b,f){var d=this.options;if(d.disabled){return false}if(!b.target&&d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").find(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var h=this.active.next(),e={options:d,newHeader:a([]),oldHeader:d.active,newContent:a([]),oldContent:h},c=(this.active=a([]));this._toggle(c,h,e);return false}var g=a(b.currentTarget||f);var i=g[0]==this.active[0];if(this.running||(!d.collapsible&&i)){return false}this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").find(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");if(!i){g.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").find(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);g.next().addClass("ui-accordion-content-active")}var c=g.next(),h=this.active.next(),e={options:d,newHeader:i&&d.collapsible?a([]):g,oldHeader:this.active,newContent:i&&d.collapsible?a([]):c.find("> *"),oldContent:h.find("> *")},j=this.headers.index(this.active[0])>this.headers.index(g[0]);this.active=i?a([]):g;this._toggle(c,h,e,i,j);return false},_toggle:function(b,i,g,j,k){var d=this.options,m=this;this.toShow=b;this.toHide=i;this.data=g;var c=function(){if(!m){return}return m._completed.apply(m,arguments)};this._trigger("changestart",null,this.data);this.running=i.size()===0?b.size():i.size();if(d.animated){var f={};if(d.collapsible&&j){f={toShow:a([]),toHide:i,complete:c,down:k,autoHeight:d.autoHeight||d.fillSpace}}else{f={toShow:b,toHide:i,complete:c,down:k,autoHeight:d.autoHeight||d.fillSpace}}if(!d.proxied){d.proxied=d.animated}if(!d.proxiedDuration){d.proxiedDuration=d.duration}d.animated=a.isFunction(d.proxied)?d.proxied(f):d.proxied;d.duration=a.isFunction(d.proxiedDuration)?d.proxiedDuration(f):d.proxiedDuration;var l=a.ui.accordion.animations,e=d.duration,h=d.animated;if(!l[h]){l[h]=function(n){this.slide(n,{easing:h,duration:e||700})}}l[h](f)}else{if(d.collapsible&&j){b.toggle()}else{i.hide();b.show()}c(true)}i.prev().attr("aria-expanded","false").attr("tabIndex","-1").blur();b.prev().attr("aria-expanded","true").attr("tabIndex","0").focus()},_completed:function(b){var c=this.options;this.running=b?0:--this.running;if(this.running){return}if(c.clearStyle){this.toShow.add(this.toHide).css({height:"",overflow:""})}this._trigger("change",null,this.data)}});a.extend(a.ui.accordion,{version:"1.7.3",defaults:{active:null,alwaysOpen:true,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()==location.href.toLowerCase()}},animations:{slide:function(j,h){j=a.extend({easing:"swing",duration:300},j,h);if(!j.toHide.size()){j.toShow.animate({height:"show"},j);return}if(!j.toShow.size()){j.toHide.animate({height:"hide"},j);return}var c=j.toShow.css("overflow"),g,d={},f={},e=["height","paddingTop","paddingBottom"],b;var i=j.toShow;b=i[0].style.width;i.width(parseInt(i.parent().width(),10)-parseInt(i.css("paddingLeft"),10)-parseInt(i.css("paddingRight"),10)-(parseInt(i.css("borderLeftWidth"),10)||0)-(parseInt(i.css("borderRightWidth"),10)||0));a.each(e,function(k,m){f[m]="hide";var l=(""+a.css(j.toShow[0],m)).match(/^([\d+-.]+)(.*)$/);d[m]={value:l[1],unit:l[2]||"px"}});j.toShow.css({height:0,overflow:"hidden"}).show();j.toHide.filter(":hidden").each(j.complete).end().filter(":visible").animate(f,{step:function(k,l){if(l.prop=="height"){g=(l.now-l.start)/(l.end-l.start)}j.toShow[0].style[l.prop]=(g*d[l.prop].value)+d[l.prop].unit},duration:j.duration,easing:j.easing,complete:function(){if(!j.autoHeight){j.toShow.css("height","")}j.toShow.css("width",b);j.toShow.css({overflow:c});j.complete()}})},bounceslide:function(b){this.slide(b,{easing:b.down?"easeOutBounce":"swing",duration:b.down?1000:200})},easeslide:function(b){this.slide(b,{easing:"easeinout",duration:700})}}})})(jQuery);;/*
 * jQuery UI Dialog 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Dialog
 *
 * Depends:
 *	ui.core.js
 *	ui.draggable.js
 *	ui.resizable.js
 */
(function(c){var b={dragStart:"start.draggable",drag:"drag.draggable",dragStop:"stop.draggable",maxHeight:"maxHeight.resizable",minHeight:"minHeight.resizable",maxWidth:"maxWidth.resizable",minWidth:"minWidth.resizable",resizeStart:"start.resizable",resize:"drag.resizable",resizeStop:"stop.resizable"},a="ui-dialog ui-widget ui-widget-content ui-corner-all ";c.widget("ui.dialog",{_init:function(){this.originalTitle=this.element.attr("title");var l=this,m=this.options,j=m.title||this.originalTitle||"&nbsp;",e=c.ui.dialog.getTitleId(this.element),k=(this.uiDialog=c("<div/>")).appendTo(document.body).hide().addClass(a+m.dialogClass).css({position:"absolute",overflow:"hidden",zIndex:m.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(n){(m.closeOnEscape&&n.keyCode&&n.keyCode==c.ui.keyCode.ESCAPE&&l.close(n))}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(n){l.moveToTop(false,n)}),g=this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(k),f=(this.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(k),i=c('<a href="#"/>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){i.addClass("ui-state-hover")},function(){i.removeClass("ui-state-hover")}).focus(function(){i.addClass("ui-state-focus")}).blur(function(){i.removeClass("ui-state-focus")}).mousedown(function(n){n.stopPropagation()}).click(function(n){l.close(n);return false}).appendTo(f),h=(this.uiDialogTitlebarCloseText=c("<span/>")).addClass("ui-icon ui-icon-closethick").text(m.closeText).appendTo(i),d=c("<span/>").addClass("ui-dialog-title").attr("id",e).html(j).prependTo(f);f.find("*").add(f).disableSelection();(m.draggable&&c.fn.draggable&&this._makeDraggable());(m.resizable&&c.fn.resizable&&this._makeResizable());this._createButtons(m.buttons);this._isOpen=false;(m.bgiframe&&c.fn.bgiframe&&k.bgiframe());(m.autoOpen&&this.open())},destroy:function(){(this.overlay&&this.overlay.destroy());this.uiDialog.hide();this.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");this.uiDialog.remove();(this.originalTitle&&this.element.attr("title",this.originalTitle))},close:function(f){var d=this;if(false===d._trigger("beforeclose",f)){return}(d.overlay&&d.overlay.destroy());d.uiDialog.unbind("keypress.ui-dialog");(d.options.hide?d.uiDialog.hide(d.options.hide,function(){d._trigger("close",f)}):d.uiDialog.hide()&&d._trigger("close",f));c.ui.dialog.overlay.resize();d._isOpen=false;if(d.options.modal){var e=0;c(".ui-dialog").each(function(){if(this!=d.uiDialog[0]){e=Math.max(e,c(this).css("z-index"))}});c.ui.dialog.maxZ=e}},isOpen:function(){return this._isOpen},moveToTop:function(f,e){if((this.options.modal&&!f)||(!this.options.stack&&!this.options.modal)){return this._trigger("focus",e)}if(this.options.zIndex>c.ui.dialog.maxZ){c.ui.dialog.maxZ=this.options.zIndex}(this.overlay&&this.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=++c.ui.dialog.maxZ));var d={scrollTop:this.element.attr("scrollTop"),scrollLeft:this.element.attr("scrollLeft")};this.uiDialog.css("z-index",++c.ui.dialog.maxZ);this.element.attr(d);this._trigger("focus",e)},open:function(){if(this._isOpen){return}var e=this.options,d=this.uiDialog;this.overlay=e.modal?new c.ui.dialog.overlay(this):null;(d.next().length&&d.appendTo("body"));this._size();this._position(e.position);d.show(e.show);this.moveToTop(true);(e.modal&&d.bind("keypress.ui-dialog",function(h){if(h.keyCode!=c.ui.keyCode.TAB){return}var g=c(":tabbable",this),i=g.filter(":first")[0],f=g.filter(":last")[0];if(h.target==f&&!h.shiftKey){setTimeout(function(){i.focus()},1)}else{if(h.target==i&&h.shiftKey){setTimeout(function(){f.focus()},1)}}}));c([]).add(d.find(".ui-dialog-content :tabbable:first")).add(d.find(".ui-dialog-buttonpane :tabbable:first")).add(d).filter(":first").focus();this._trigger("open");this._isOpen=true},_createButtons:function(g){var f=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix");this.uiDialog.find(".ui-dialog-buttonpane").remove();(typeof g=="object"&&g!==null&&c.each(g,function(){return !(d=true)}));if(d){c.each(g,function(h,i){c('<button type="button"></button>').addClass("ui-state-default ui-corner-all").text(h).click(function(){i.apply(f.element[0],arguments)}).hover(function(){c(this).addClass("ui-state-hover")},function(){c(this).removeClass("ui-state-hover")}).focus(function(){c(this).addClass("ui-state-focus")}).blur(function(){c(this).removeClass("ui-state-focus")}).appendTo(e)});e.appendTo(this.uiDialog)}},_makeDraggable:function(){var d=this,f=this.options,e;this.uiDialog.draggable({cancel:".ui-dialog-content",handle:".ui-dialog-titlebar",containment:"document",start:function(){e=f.height;c(this).height(c(this).height()).addClass("ui-dialog-dragging");(f.dragStart&&f.dragStart.apply(d.element[0],arguments))},drag:function(){(f.drag&&f.drag.apply(d.element[0],arguments))},stop:function(){c(this).removeClass("ui-dialog-dragging").height(e);(f.dragStop&&f.dragStop.apply(d.element[0],arguments));c.ui.dialog.overlay.resize()}})},_makeResizable:function(g){g=(g===undefined?this.options.resizable:g);var d=this,f=this.options,e=typeof g=="string"?g:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",alsoResize:this.element,maxWidth:f.maxWidth,maxHeight:f.maxHeight,minWidth:f.minWidth,minHeight:f.minHeight,start:function(){c(this).addClass("ui-dialog-resizing");(f.resizeStart&&f.resizeStart.apply(d.element[0],arguments))},resize:function(){(f.resize&&f.resize.apply(d.element[0],arguments))},handles:e,stop:function(){c(this).removeClass("ui-dialog-resizing");f.height=c(this).height();f.width=c(this).width();(f.resizeStop&&f.resizeStop.apply(d.element[0],arguments));c.ui.dialog.overlay.resize()}}).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_position:function(i){var e=c(window),f=c(document),g=f.scrollTop(),d=f.scrollLeft(),h=g;if(c.inArray(i,["center","top","right","bottom","left"])>=0){i=[i=="right"||i=="left"?i:"center",i=="top"||i=="bottom"?i:"middle"]}if(i.constructor!=Array){i=["center","middle"]}if(i[0].constructor==Number){d+=i[0]}else{switch(i[0]){case"left":d+=0;break;case"right":d+=e.width()-this.uiDialog.outerWidth();break;default:case"center":d+=(e.width()-this.uiDialog.outerWidth())/2}}if(i[1].constructor==Number){g+=i[1]}else{switch(i[1]){case"top":g+=0;break;case"bottom":g+=e.height()-this.uiDialog.outerHeight();break;default:case"middle":g+=(e.height()-this.uiDialog.outerHeight())/2}}g=Math.max(g,h);this.uiDialog.css({top:g,left:d})},_setData:function(e,f){(b[e]&&this.uiDialog.data(b[e],f));switch(e){case"buttons":this._createButtons(f);break;case"closeText":this.uiDialogTitlebarCloseText.text(f);break;case"dialogClass":this.uiDialog.removeClass(this.options.dialogClass).addClass(a+f);break;case"draggable":(f?this._makeDraggable():this.uiDialog.draggable("destroy"));break;case"height":this.uiDialog.height(f);break;case"position":this._position(f);break;case"resizable":var d=this.uiDialog,g=this.uiDialog.is(":data(resizable)");(g&&!f&&d.resizable("destroy"));(g&&typeof f=="string"&&d.resizable("option","handles",f));(g||this._makeResizable(f));break;case"title":c(".ui-dialog-title",this.uiDialogTitlebar).html(f||"&nbsp;");break;case"width":this.uiDialog.width(f);break}c.widget.prototype._setData.apply(this,arguments)},_size:function(){var e=this.options;this.element.css({height:0,minHeight:0,width:"auto"});var d=this.uiDialog.css({height:"auto",width:e.width}).height();this.element.css({minHeight:Math.max(e.minHeight-d,0),height:e.height=="auto"?"auto":Math.max(e.height-d,0)})}});c.extend(c.ui.dialog,{version:"1.7.3",defaults:{autoOpen:true,bgiframe:false,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:"center",resizable:true,show:null,stack:true,title:"",width:300,zIndex:1000},getter:"isOpen",uuid:0,maxZ:0,getTitleId:function(d){return"ui-dialog-title-"+(d.attr("id")||++this.uuid)},overlay:function(d){this.$el=c.ui.dialog.overlay.create(d)}});c.extend(c.ui.dialog.overlay,{instances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(d){return d+".dialog-overlay"}).join(" "),create:function(e){if(this.instances.length===0){setTimeout(function(){if(c.ui.dialog.overlay.instances.length){c(document).bind(c.ui.dialog.overlay.events,function(f){var g=c(f.target).parents(".ui-dialog").css("zIndex")||0;return(g>c.ui.dialog.overlay.maxZ)})}},1);c(document).bind("keydown.dialog-overlay",function(f){(e.options.closeOnEscape&&f.keyCode&&f.keyCode==c.ui.keyCode.ESCAPE&&e.close(f))});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var d=c("<div></div>").appendTo(document.body).addClass("ui-widget-overlay").css({width:this.width(),height:this.height()});(e.options.bgiframe&&c.fn.bgiframe&&d.bgiframe());this.instances.push(d);return d},destroy:function(d){this.instances.splice(c.inArray(this.instances,d),1);if(this.instances.length===0){c([document,window]).unbind(".dialog-overlay")}d.remove();var e=0;c.each(this.instances,function(){e=Math.max(e,this.css("z-index"))});this.maxZ=e},height:function(){if(c.browser.msie&&c.browser.version<7){var e=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);var d=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);if(e<d){return c(window).height()+"px"}else{return e+"px"}}else{return c(document).height()+"px"}},width:function(){if(c.browser.msie&&c.browser.version<7){var d=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);var e=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);if(d<e){return c(window).width()+"px"}else{return d+"px"}}else{return c(document).width()+"px"}},resize:function(){var d=c([]);c.each(c.ui.dialog.overlay.instances,function(){d=d.add(this)});d.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);;/*
 * jQuery UI Slider 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Slider
 *
 * Depends:
 *	ui.core.js
 */
(function(a){a.widget("ui.slider",a.extend({},a.ui.mouse,{_init:function(){var b=this,c=this.options;this._keySliding=false;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");this.range=a([]);if(c.range){if(c.range===true){this.range=a("<div></div>");if(!c.values){c.values=[this._valueMin(),this._valueMin()]}if(c.values.length&&c.values.length!=2){c.values=[c.values[0],c.values[0]]}}else{this.range=a("<div></div>")}this.range.appendTo(this.element).addClass("ui-slider-range");if(c.range=="min"||c.range=="max"){this.range.addClass("ui-slider-range-"+c.range)}this.range.addClass("ui-widget-header")}if(a(".ui-slider-handle",this.element).length==0){a('<a href="#"></a>').appendTo(this.element).addClass("ui-slider-handle")}if(c.values&&c.values.length){while(a(".ui-slider-handle",this.element).length<c.values.length){a('<a href="#"></a>').appendTo(this.element).addClass("ui-slider-handle")}}this.handles=a(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(d){d.preventDefault()}).hover(function(){if(!c.disabled){a(this).addClass("ui-state-hover")}},function(){a(this).removeClass("ui-state-hover")}).focus(function(){if(!c.disabled){a(".ui-slider .ui-state-focus").removeClass("ui-state-focus");a(this).addClass("ui-state-focus")}else{a(this).blur()}}).blur(function(){a(this).removeClass("ui-state-focus")});this.handles.each(function(d){a(this).data("index.ui-slider-handle",d)});this.handles.keydown(function(i){var f=true;var e=a(this).data("index.ui-slider-handle");if(b.options.disabled){return}switch(i.keyCode){case a.ui.keyCode.HOME:case a.ui.keyCode.END:case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:f=false;if(!b._keySliding){b._keySliding=true;a(this).addClass("ui-state-active");b._start(i,e)}break}var g,d,h=b._step();if(b.options.values&&b.options.values.length){g=d=b.values(e)}else{g=d=b.value()}switch(i.keyCode){case a.ui.keyCode.HOME:d=b._valueMin();break;case a.ui.keyCode.END:d=b._valueMax();break;case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:if(g==b._valueMax()){return}d=g+h;break;case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:if(g==b._valueMin()){return}d=g-h;break}b._slide(i,e,d);return f}).keyup(function(e){var d=a(this).data("index.ui-slider-handle");if(b._keySliding){b._stop(e,d);b._change(e,d);b._keySliding=false;a(this).removeClass("ui-state-active")}});this._refreshValue()},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy()},_mouseCapture:function(d){var e=this.options;if(e.disabled){return false}this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();var h={x:d.pageX,y:d.pageY};var j=this._normValueFromMouse(h);var c=this._valueMax()-this._valueMin()+1,f;var k=this,i;this.handles.each(function(l){var m=Math.abs(j-k.values(l));if(c>m){c=m;f=a(this);i=l}});if(e.range==true&&this.values(1)==e.min){f=a(this.handles[++i])}this._start(d,i);k._handleIndex=i;f.addClass("ui-state-active").focus();var g=f.offset();var b=!a(d.target).parents().andSelf().is(".ui-slider-handle");this._clickOffset=b?{left:0,top:0}:{left:d.pageX-g.left-(f.width()/2),top:d.pageY-g.top-(f.height()/2)-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};j=this._normValueFromMouse(h);this._slide(d,i,j);return true},_mouseStart:function(b){return true},_mouseDrag:function(d){var b={x:d.pageX,y:d.pageY};var c=this._normValueFromMouse(b);this._slide(d,this._handleIndex,c);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._handleIndex=null;this._clickOffset=null;return false},_detectOrientation:function(){this.orientation=this.options.orientation=="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(d){var c,h;if("horizontal"==this.orientation){c=this.elementSize.width;h=d.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{c=this.elementSize.height;h=d.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}var f=(h/c);if(f>1){f=1}if(f<0){f=0}if("vertical"==this.orientation){f=1-f}var e=this._valueMax()-this._valueMin(),i=f*e,b=i%this.options.step,g=this._valueMin()+i-b;if(b>(this.options.step/2)){g+=this.options.step}return parseFloat(g.toFixed(5))},_start:function(d,c){var b={handle:this.handles[c],value:this.value()};if(this.options.values&&this.options.values.length){b.value=this.values(c);b.values=this.values()}this._trigger("start",d,b)},_slide:function(f,e,d){var g=this.handles[e];if(this.options.values&&this.options.values.length){var b=this.values(e?0:1);if((this.options.values.length==2&&this.options.range===true)&&((e==0&&d>b)||(e==1&&d<b))){d=b}if(d!=this.values(e)){var c=this.values();c[e]=d;var h=this._trigger("slide",f,{handle:this.handles[e],value:d,values:c});var b=this.values(e?0:1);if(h!==false){this.values(e,d,(f.type=="mousedown"&&this.options.animate),true)}}}else{if(d!=this.value()){var h=this._trigger("slide",f,{handle:this.handles[e],value:d});if(h!==false){this._setData("value",d,(f.type=="mousedown"&&this.options.animate))}}}},_stop:function(d,c){var b={handle:this.handles[c],value:this.value()};if(this.options.values&&this.options.values.length){b.value=this.values(c);b.values=this.values()}this._trigger("stop",d,b)},_change:function(d,c){var b={handle:this.handles[c],value:this.value()};if(this.options.values&&this.options.values.length){b.value=this.values(c);b.values=this.values()}this._trigger("change",d,b)},value:function(b){if(arguments.length){this._setData("value",b);this._change(null,0)}return this._value()},values:function(b,e,c,d){if(arguments.length>1){this.options.values[b]=e;this._refreshValue(c);if(!d){this._change(null,b)}}if(arguments.length){if(this.options.values&&this.options.values.length){return this._values(b)}else{return this.value()}}else{return this._values()}},_setData:function(b,d,c){a.widget.prototype._setData.apply(this,arguments);switch(b){case"disabled":if(d){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled")}else{this.handles.removeAttr("disabled")}case"orientation":this._detectOrientation();this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue(c);break;case"value":this._refreshValue(c);break}},_step:function(){var b=this.options.step;return b},_value:function(){var b=this.options.value;if(b<this._valueMin()){b=this._valueMin()}if(b>this._valueMax()){b=this._valueMax()}return b},_values:function(b){if(arguments.length){var c=this.options.values[b];if(c<this._valueMin()){c=this._valueMin()}if(c>this._valueMax()){c=this._valueMax()}return c}else{return this.options.values}},_valueMin:function(){var b=this.options.min;return b},_valueMax:function(){var b=this.options.max;return b},_refreshValue:function(c){var f=this.options.range,d=this.options,l=this;if(this.options.values&&this.options.values.length){var i,h;this.handles.each(function(p,n){var o=(l.values(p)-l._valueMin())/(l._valueMax()-l._valueMin())*100;var m={};m[l.orientation=="horizontal"?"left":"bottom"]=o+"%";a(this).stop(1,1)[c?"animate":"css"](m,d.animate);if(l.options.range===true){if(l.orientation=="horizontal"){(p==0)&&l.range.stop(1,1)[c?"animate":"css"]({left:o+"%"},d.animate);(p==1)&&l.range[c?"animate":"css"]({width:(o-lastValPercent)+"%"},{queue:false,duration:d.animate})}else{(p==0)&&l.range.stop(1,1)[c?"animate":"css"]({bottom:(o)+"%"},d.animate);(p==1)&&l.range[c?"animate":"css"]({height:(o-lastValPercent)+"%"},{queue:false,duration:d.animate})}}lastValPercent=o})}else{var j=this.value(),g=this._valueMin(),k=this._valueMax(),e=k!=g?(j-g)/(k-g)*100:0;var b={};b[l.orientation=="horizontal"?"left":"bottom"]=e+"%";this.handle.stop(1,1)[c?"animate":"css"](b,d.animate);(f=="min")&&(this.orientation=="horizontal")&&this.range.stop(1,1)[c?"animate":"css"]({width:e+"%"},d.animate);(f=="max")&&(this.orientation=="horizontal")&&this.range[c?"animate":"css"]({width:(100-e)+"%"},{queue:false,duration:d.animate});(f=="min")&&(this.orientation=="vertical")&&this.range.stop(1,1)[c?"animate":"css"]({height:e+"%"},d.animate);(f=="max")&&(this.orientation=="vertical")&&this.range[c?"animate":"css"]({height:(100-e)+"%"},{queue:false,duration:d.animate})}}}));a.extend(a.ui.slider,{getter:"value values",version:"1.7.3",eventPrefix:"slide",defaults:{animate:false,delay:0,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null}})})(jQuery);;/*
 * jQuery UI Tabs 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Tabs
 *
 * Depends:
 *	ui.core.js
 */
(function(c){var b=0,a=0;c.widget("ui.tabs",{_init:function(){if(this.options.deselectable!==undefined){this.options.collapsible=this.options.deselectable}this._tabify(true)},_setData:function(d,e){if(d=="selected"){if(this.options.collapsible&&e==this.options.selected){return}this.select(e)}else{this.options[d]=e;if(d=="deselectable"){this.options.collapsible=e}this._tabify()}},_tabId:function(d){return d.title&&d.title.replace(/\s/g,"_").replace(/[^A-Za-z0-9\-_:\.]/g,"")||this.options.idPrefix+(++b)},_sanitizeSelector:function(d){return d.replace(/:/g,"\\:")},_cookie:function(){var d=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+(++a));return c.cookie.apply(null,[d].concat(c.makeArray(arguments)))},_ui:function(e,d){return{tab:e,panel:d,index:this.anchors.index(e)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var d=c(this);d.html(d.data("label.tabs")).removeData("label.tabs")})},_tabify:function(q){this.list=this.element.children("ul:first");this.lis=c("li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return c("a",this)[0]});this.panels=c([]);var r=this,f=this.options;var e=/^#.+/;this.anchors.each(function(u,o){var s=c(o).attr("href");var v=s.split("#")[0],w;if(v&&(v===location.toString().split("#")[0]||(w=c("base")[0])&&v===w.href)){s=o.hash;o.href=s}if(e.test(s)){r.panels=r.panels.add(r._sanitizeSelector(s))}else{if(s!="#"){c.data(o,"href.tabs",s);c.data(o,"load.tabs",s.replace(/#.*$/,""));var y=r._tabId(o);o.href="#"+y;var x=c("#"+y);if(!x.length){x=c(f.panelTemplate).attr("id",y).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(r.panels[u-1]||r.list);x.data("destroy.tabs",true)}r.panels=r.panels.add(x)}else{f.disabled.push(u)}}});if(q){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(f.selected===undefined){if(location.hash){this.anchors.each(function(s,o){if(o.hash==location.hash){f.selected=s;return false}})}if(typeof f.selected!="number"&&f.cookie){f.selected=parseInt(r._cookie(),10)}if(typeof f.selected!="number"&&this.lis.filter(".ui-tabs-selected").length){f.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))}f.selected=f.selected||0}else{if(f.selected===null){f.selected=-1}}f.selected=((f.selected>=0&&this.anchors[f.selected])||f.selected<0)?f.selected:0;f.disabled=c.unique(f.disabled.concat(c.map(this.lis.filter(".ui-state-disabled"),function(s,o){return r.lis.index(s)}))).sort();if(c.inArray(f.selected,f.disabled)!=-1){f.disabled.splice(c.inArray(f.selected,f.disabled),1)}this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");if(f.selected>=0&&this.anchors.length){this.panels.eq(f.selected).removeClass("ui-tabs-hide");this.lis.eq(f.selected).addClass("ui-tabs-selected ui-state-active");r.element.queue("tabs",function(){r._trigger("show",null,r._ui(r.anchors[f.selected],r.panels[f.selected]))});this.load(f.selected)}c(window).bind("unload",function(){r.lis.add(r.anchors).unbind(".tabs");r.lis=r.anchors=r.panels=null})}else{f.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))}this.element[f.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");if(f.cookie){this._cookie(f.selected,f.cookie)}for(var j=0,p;(p=this.lis[j]);j++){c(p)[c.inArray(j,f.disabled)!=-1&&!c(p).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled")}if(f.cache===false){this.anchors.removeData("cache.tabs")}this.lis.add(this.anchors).unbind(".tabs");if(f.event!="mouseover"){var h=function(o,i){if(i.is(":not(.ui-state-disabled)")){i.addClass("ui-state-"+o)}};var l=function(o,i){i.removeClass("ui-state-"+o)};this.lis.bind("mouseover.tabs",function(){h("hover",c(this))});this.lis.bind("mouseout.tabs",function(){l("hover",c(this))});this.anchors.bind("focus.tabs",function(){h("focus",c(this).closest("li"))});this.anchors.bind("blur.tabs",function(){l("focus",c(this).closest("li"))})}var d,k;if(f.fx){if(c.isArray(f.fx)){d=f.fx[0];k=f.fx[1]}else{d=k=f.fx}}function g(i,o){i.css({display:""});if(c.browser.msie&&o.opacity){i[0].style.removeAttribute("filter")}}var m=k?function(i,o){c(i).closest("li").removeClass("ui-state-default").addClass("ui-tabs-selected ui-state-active");o.hide().removeClass("ui-tabs-hide").animate(k,k.duration||"normal",function(){g(o,k);r._trigger("show",null,r._ui(i,o[0]))})}:function(i,o){c(i).closest("li").removeClass("ui-state-default").addClass("ui-tabs-selected ui-state-active");o.removeClass("ui-tabs-hide");r._trigger("show",null,r._ui(i,o[0]))};var n=d?function(o,i){i.animate(d,d.duration||"normal",function(){r.lis.removeClass("ui-tabs-selected ui-state-active").addClass("ui-state-default");i.addClass("ui-tabs-hide");g(i,d);r.element.dequeue("tabs")})}:function(o,i,s){r.lis.removeClass("ui-tabs-selected ui-state-active").addClass("ui-state-default");i.addClass("ui-tabs-hide");r.element.dequeue("tabs")};this.anchors.bind(f.event+".tabs",function(){var o=this,u=c(this).closest("li"),i=r.panels.filter(":not(.ui-tabs-hide)"),s=c(r._sanitizeSelector(this.hash));if((u.hasClass("ui-tabs-selected")&&!f.collapsible)||u.hasClass("ui-state-disabled")||u.hasClass("ui-state-processing")||r._trigger("select",null,r._ui(this,s[0]))===false){this.blur();return false}f.selected=r.anchors.index(this);r.abort();if(f.collapsible){if(u.hasClass("ui-tabs-selected")){f.selected=-1;if(f.cookie){r._cookie(f.selected,f.cookie)}r.element.queue("tabs",function(){n(o,i)}).dequeue("tabs");this.blur();return false}else{if(!i.length){if(f.cookie){r._cookie(f.selected,f.cookie)}r.element.queue("tabs",function(){m(o,s)});r.load(r.anchors.index(this));this.blur();return false}}}if(f.cookie){r._cookie(f.selected,f.cookie)}if(s.length){if(i.length){r.element.queue("tabs",function(){n(o,i)})}r.element.queue("tabs",function(){m(o,s)});r.load(r.anchors.index(this))}else{throw"jQuery UI Tabs: Mismatching fragment identifier."}if(c.browser.msie){this.blur()}});this.anchors.bind("click.tabs",function(){return false})},destroy:function(){var d=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=c.data(this,"href.tabs");if(e){this.href=e}var f=c(this).unbind(".tabs");c.each(["href","load","cache"],function(g,h){f.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){if(c.data(this,"destroy.tabs")){c(this).remove()}else{c(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}});if(d.cookie){this._cookie(null,d.cookie)}},add:function(g,f,e){if(e===undefined){e=this.anchors.length}var d=this,i=this.options,k=c(i.tabTemplate.replace(/#\{href\}/g,g).replace(/#\{label\}/g,f)),j=!g.indexOf("#")?g.replace("#",""):this._tabId(c("a",k)[0]);k.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var h=c("#"+j);if(!h.length){h=c(i.panelTemplate).attr("id",j).data("destroy.tabs",true)}h.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(e>=this.lis.length){k.appendTo(this.list);h.appendTo(this.list[0].parentNode)}else{k.insertBefore(this.lis[e]);h.insertBefore(this.panels[e])}i.disabled=c.map(i.disabled,function(m,l){return m>=e?++m:m});this._tabify();if(this.anchors.length==1){k.addClass("ui-tabs-selected ui-state-active");h.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){d._trigger("show",null,d._ui(d.anchors[0],d.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[e],this.panels[e]))},remove:function(d){var f=this.options,g=this.lis.eq(d).remove(),e=this.panels.eq(d).remove();if(g.hasClass("ui-tabs-selected")&&this.anchors.length>1){this.select(d+(d+1<this.anchors.length?1:-1))}f.disabled=c.map(c.grep(f.disabled,function(j,h){return j!=d}),function(j,h){return j>=d?--j:j});this._tabify();this._trigger("remove",null,this._ui(g.find("a")[0],e[0]))},enable:function(d){var e=this.options;if(c.inArray(d,e.disabled)==-1){return}this.lis.eq(d).removeClass("ui-state-disabled");e.disabled=c.grep(e.disabled,function(g,f){return g!=d});this._trigger("enable",null,this._ui(this.anchors[d],this.panels[d]))},disable:function(e){var d=this,f=this.options;if(e!=f.selected){this.lis.eq(e).addClass("ui-state-disabled");f.disabled.push(e);f.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[e],this.panels[e]))}},select:function(d){if(typeof d=="string"){d=this.anchors.index(this.anchors.filter("[href$="+d+"]"))}else{if(d===null){d=-1}}if(d==-1&&this.options.collapsible){d=this.options.selected}this.anchors.eq(d).trigger(this.options.event+".tabs")},load:function(g){var e=this,i=this.options,d=this.anchors.eq(g)[0],f=c.data(d,"load.tabs");this.abort();if(!f||this.element.queue("tabs").length!==0&&c.data(d,"cache.tabs")){this.element.dequeue("tabs");return}this.lis.eq(g).addClass("ui-state-processing");if(i.spinner){var h=c("span",d);h.data("label.tabs",h.html()).html(i.spinner)}this.xhr=c.ajax(c.extend({},i.ajaxOptions,{url:f,success:function(k,j){c(e._sanitizeSelector(d.hash)).html(k);e._cleanup();if(i.cache){c.data(d,"cache.tabs",true)}e._trigger("load",null,e._ui(e.anchors[g],e.panels[g]));try{i.ajaxOptions.success(k,j)}catch(l){}e.element.dequeue("tabs")}}))},abort:function(){this.element.queue([]);this.panels.stop(false,true);if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup()},url:function(e,d){this.anchors.eq(e).removeData("cache.tabs").data("load.tabs",d)},length:function(){return this.anchors.length}});c.extend(c.ui.tabs,{version:"1.7.3",getter:"length",defaults:{ajaxOptions:null,cache:false,cookie:null,collapsible:false,disabled:[],event:"click",fx:null,idPrefix:"ui-tabs-",panelTemplate:"<div></div>",spinner:"<em>Loading&#8230;</em>",tabTemplate:'<li><a href="#{href}"><span>#{label}</span></a></li>'}});c.extend(c.ui.tabs.prototype,{rotation:null,rotate:function(f,h){var d=this,i=this.options;var e=d._rotate||(d._rotate=function(j){clearTimeout(d.rotation);d.rotation=setTimeout(function(){var k=i.selected;d.select(++k<d.anchors.length?k:0)},f);if(j){j.stopPropagation()}});var g=d._unrotate||(d._unrotate=!h?function(j){if(j.clientX){d.rotate(null)}}:function(j){t=i.selected;e()});if(f){this.element.bind("tabsshow",e);this.anchors.bind(i.event+".tabs",g);e()}else{clearTimeout(d.rotation);this.element.unbind("tabsshow",e);this.anchors.unbind(i.event+".tabs",g);delete this._rotate;delete this._unrotate}}})})(jQuery);;/*
 * jQuery UI Datepicker 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Datepicker
 *
 * Depends:
 *	ui.core.js
 */
(function($){$.extend($.ui,{datepicker:{version:"1.7.3"}});var PROP_NAME="datepicker";function Datepicker(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._datepickerShowing=false;this._inDialog=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass="ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],dateFormat:"mm/dd/yy",firstDay:0,isRTL:false};this._defaults={showOn:"focus",showAnim:"show",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,showMonthAfterYear:false,yearRange:"-10:+10",showOtherMonths:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"normal",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false};$.extend(this._defaults,this.regional[""]);this.dpDiv=$('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>')}$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",log:function(){if(this.debug){console.log.apply("",arguments)}},setDefaults:function(settings){extendRemove(this._defaults,settings||{});return this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase();var inline=(nodeName=="div"||nodeName=="span");if(!target.id){target.id="dp"+(++this.uuid)}var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{});if(nodeName=="input"){this._connectDatepicker(target,inst)}else{if(inline){this._inlineDatepicker(target,inst)}}},_newInst:function(target,inline){var id=target[0].id.replace(/([:\[\]\.])/g,"\\\\$1");return{id:id,input:target,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:inline,dpDiv:(!inline?this.dpDiv:$('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}},_connectDatepicker:function(target,inst){var input=$(target);inst.append=$([]);inst.trigger=$([]);if(input.hasClass(this.markerClassName)){return}var appendText=this._get(inst,"appendText");var isRTL=this._get(inst,"isRTL");if(appendText){inst.append=$('<span class="'+this._appendClass+'">'+appendText+"</span>");input[isRTL?"before":"after"](inst.append)}var showOn=this._get(inst,"showOn");if(showOn=="focus"||showOn=="both"){input.focus(this._showDatepicker)}if(showOn=="button"||showOn=="both"){var buttonText=this._get(inst,"buttonText");var buttonImage=this._get(inst,"buttonImage");inst.trigger=$(this._get(inst,"buttonImageOnly")?$("<img/>").addClass(this._triggerClass).attr({src:buttonImage,alt:buttonText,title:buttonText}):$('<button type="button"></button>').addClass(this._triggerClass).html(buttonImage==""?buttonText:$("<img/>").attr({src:buttonImage,alt:buttonText,title:buttonText})));input[isRTL?"before":"after"](inst.trigger);inst.trigger.click(function(){if($.datepicker._datepickerShowing&&$.datepicker._lastInput==target){$.datepicker._hideDatepicker()}else{$.datepicker._showDatepicker(target)}return false})}input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});$.data(target,PROP_NAME,inst)},_inlineDatepicker:function(target,inst){var divSpan=$(target);if(divSpan.hasClass(this.markerClassName)){return}divSpan.addClass(this.markerClassName).append(inst.dpDiv).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});$.data(target,PROP_NAME,inst);this._setDate(inst,this._getDefaultDate(inst));this._updateDatepicker(inst);this._updateAlternate(inst)},_dialogDatepicker:function(input,dateText,onSelect,settings,pos){var inst=this._dialogInst;if(!inst){var id="dp"+(++this.uuid);this._dialogInput=$('<input type="text" id="'+id+'" size="1" style="position: absolute; top: -100px;"/>');this._dialogInput.keydown(this._doKeyDown);$("body").append(this._dialogInput);inst=this._dialogInst=this._newInst(this._dialogInput,false);inst.settings={};$.data(this._dialogInput[0],PROP_NAME,inst)}extendRemove(inst.settings,settings||{});this._dialogInput.val(dateText);this._pos=(pos?(pos.length?pos:[pos.pageX,pos.pageY]):null);if(!this._pos){var browserWidth=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth;var browserHeight=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;var scrollX=document.documentElement.scrollLeft||document.body.scrollLeft;var scrollY=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[(browserWidth/2)-100+scrollX,(browserHeight/2)-150+scrollY]}this._dialogInput.css("left",this._pos[0]+"px").css("top",this._pos[1]+"px");inst.settings.onSelect=onSelect;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);if($.blockUI){$.blockUI(this.dpDiv)}$.data(this._dialogInput[0],PROP_NAME,inst);return this},_destroyDatepicker:function(target){var $target=$(target);var inst=$.data(target,PROP_NAME);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();$.removeData(target,PROP_NAME);if(nodeName=="input"){inst.append.remove();inst.trigger.remove();$target.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress)}else{if(nodeName=="div"||nodeName=="span"){$target.removeClass(this.markerClassName).empty()}}},_enableDatepicker:function(target){var $target=$(target);var inst=$.data(target,PROP_NAME);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();if(nodeName=="input"){target.disabled=false;inst.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else{if(nodeName=="div"||nodeName=="span"){var inline=$target.children("."+this._inlineClass);inline.children().removeClass("ui-state-disabled")}}this._disabledInputs=$.map(this._disabledInputs,function(value){return(value==target?null:value)})},_disableDatepicker:function(target){var $target=$(target);var inst=$.data(target,PROP_NAME);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();if(nodeName=="input"){target.disabled=true;inst.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else{if(nodeName=="div"||nodeName=="span"){var inline=$target.children("."+this._inlineClass);inline.children().addClass("ui-state-disabled")}}this._disabledInputs=$.map(this._disabledInputs,function(value){return(value==target?null:value)});this._disabledInputs[this._disabledInputs.length]=target},_isDisabledDatepicker:function(target){if(!target){return false}for(var i=0;i<this._disabledInputs.length;i++){if(this._disabledInputs[i]==target){return true}}return false},_getInst:function(target){try{return $.data(target,PROP_NAME)}catch(err){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(target,name,value){var inst=this._getInst(target);if(arguments.length==2&&typeof name=="string"){return(name=="defaults"?$.extend({},$.datepicker._defaults):(inst?(name=="all"?$.extend({},inst.settings):this._get(inst,name)):null))}var settings=name||{};if(typeof name=="string"){settings={};settings[name]=value}if(inst){if(this._curInst==inst){this._hideDatepicker(null)}var date=this._getDateDatepicker(target);extendRemove(inst.settings,settings);this._setDateDatepicker(target,date);this._updateDatepicker(inst)}},_changeDatepicker:function(target,name,value){this._optionDatepicker(target,name,value)},_refreshDatepicker:function(target){var inst=this._getInst(target);if(inst){this._updateDatepicker(inst)}},_setDateDatepicker:function(target,date,endDate){var inst=this._getInst(target);if(inst){this._setDate(inst,date,endDate);this._updateDatepicker(inst);this._updateAlternate(inst)}},_getDateDatepicker:function(target){var inst=this._getInst(target);if(inst&&!inst.inline){this._setDateFromField(inst)}return(inst?this._getDate(inst):null)},_doKeyDown:function(event){var inst=$.datepicker._getInst(event.target);var handled=true;var isRTL=inst.dpDiv.is(".ui-datepicker-rtl");inst._keyEvent=true;if($.datepicker._datepickerShowing){switch(event.keyCode){case 9:$.datepicker._hideDatepicker(null,"");break;case 13:var sel=$("td."+$.datepicker._dayOverClass+", td."+$.datepicker._currentClass,inst.dpDiv);if(sel[0]){$.datepicker._selectDay(event.target,inst.selectedMonth,inst.selectedYear,sel[0])}else{$.datepicker._hideDatepicker(null,$.datepicker._get(inst,"duration"))}return false;break;case 27:$.datepicker._hideDatepicker(null,$.datepicker._get(inst,"duration"));break;case 33:$.datepicker._adjustDate(event.target,(event.ctrlKey?-$.datepicker._get(inst,"stepBigMonths"):-$.datepicker._get(inst,"stepMonths")),"M");break;case 34:$.datepicker._adjustDate(event.target,(event.ctrlKey?+$.datepicker._get(inst,"stepBigMonths"):+$.datepicker._get(inst,"stepMonths")),"M");break;case 35:if(event.ctrlKey||event.metaKey){$.datepicker._clearDate(event.target)}handled=event.ctrlKey||event.metaKey;break;case 36:if(event.ctrlKey||event.metaKey){$.datepicker._gotoToday(event.target)}handled=event.ctrlKey||event.metaKey;break;case 37:if(event.ctrlKey||event.metaKey){$.datepicker._adjustDate(event.target,(isRTL?+1:-1),"D")}handled=event.ctrlKey||event.metaKey;if(event.originalEvent.altKey){$.datepicker._adjustDate(event.target,(event.ctrlKey?-$.datepicker._get(inst,"stepBigMonths"):-$.datepicker._get(inst,"stepMonths")),"M")}break;case 38:if(event.ctrlKey||event.metaKey){$.datepicker._adjustDate(event.target,-7,"D")}handled=event.ctrlKey||event.metaKey;break;case 39:if(event.ctrlKey||event.metaKey){$.datepicker._adjustDate(event.target,(isRTL?-1:+1),"D")}handled=event.ctrlKey||event.metaKey;if(event.originalEvent.altKey){$.datepicker._adjustDate(event.target,(event.ctrlKey?+$.datepicker._get(inst,"stepBigMonths"):+$.datepicker._get(inst,"stepMonths")),"M")}break;case 40:if(event.ctrlKey||event.metaKey){$.datepicker._adjustDate(event.target,+7,"D")}handled=event.ctrlKey||event.metaKey;break;default:handled=false}}else{if(event.keyCode==36&&event.ctrlKey){$.datepicker._showDatepicker(this)}else{handled=false}}if(handled){event.preventDefault();event.stopPropagation()}},_doKeyPress:function(event){var inst=$.datepicker._getInst(event.target);if($.datepicker._get(inst,"constrainInput")){var chars=$.datepicker._possibleChars($.datepicker._get(inst,"dateFormat"));var chr=String.fromCharCode(event.charCode==undefined?event.keyCode:event.charCode);return event.ctrlKey||(chr<" "||!chars||chars.indexOf(chr)>-1)}},_showDatepicker:function(input){input=input.target||input;if(input.nodeName.toLowerCase()!="input"){input=$("input",input.parentNode)[0]}if($.datepicker._isDisabledDatepicker(input)||$.datepicker._lastInput==input){return}var inst=$.datepicker._getInst(input);var beforeShow=$.datepicker._get(inst,"beforeShow");extendRemove(inst.settings,(beforeShow?beforeShow.apply(input,[input,inst]):{}));$.datepicker._hideDatepicker(null,"");$.datepicker._lastInput=input;$.datepicker._setDateFromField(inst);if($.datepicker._inDialog){input.value=""}if(!$.datepicker._pos){$.datepicker._pos=$.datepicker._findPos(input);$.datepicker._pos[1]+=input.offsetHeight}var isFixed=false;$(input).parents().each(function(){isFixed|=$(this).css("position")=="fixed";return !isFixed});if(isFixed&&$.browser.opera){$.datepicker._pos[0]-=document.documentElement.scrollLeft;$.datepicker._pos[1]-=document.documentElement.scrollTop}var offset={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null;inst.rangeStart=null;inst.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});$.datepicker._updateDatepicker(inst);offset=$.datepicker._checkOffset(inst,offset,isFixed);inst.dpDiv.css({position:($.datepicker._inDialog&&$.blockUI?"static":(isFixed?"fixed":"absolute")),display:"none",left:offset.left+"px",top:offset.top+"px"});if(!inst.inline){var showAnim=$.datepicker._get(inst,"showAnim")||"show";var duration=$.datepicker._get(inst,"duration");var postProcess=function(){$.datepicker._datepickerShowing=true;if($.browser.msie&&parseInt($.browser.version,10)<7){$("iframe.ui-datepicker-cover").css({width:inst.dpDiv.width()+4,height:inst.dpDiv.height()+4})}};if($.effects&&$.effects[showAnim]){inst.dpDiv.show(showAnim,$.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[showAnim](duration,postProcess)}if(duration==""){postProcess()}if(inst.input[0].type!="hidden"){inst.input[0].focus()}$.datepicker._curInst=inst}},_updateDatepicker:function(inst){var dims={width:inst.dpDiv.width()+4,height:inst.dpDiv.height()+4};var self=this;inst.dpDiv.empty().append(this._generateHTML(inst)).find("iframe.ui-datepicker-cover").css({width:dims.width,height:dims.height}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){$(this).removeClass("ui-state-hover");if(this.className.indexOf("ui-datepicker-prev")!=-1){$(this).removeClass("ui-datepicker-prev-hover")}if(this.className.indexOf("ui-datepicker-next")!=-1){$(this).removeClass("ui-datepicker-next-hover")}}).bind("mouseover",function(){if(!self._isDisabledDatepicker(inst.inline?inst.dpDiv.parent()[0]:inst.input[0])){$(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");$(this).addClass("ui-state-hover");if(this.className.indexOf("ui-datepicker-prev")!=-1){$(this).addClass("ui-datepicker-prev-hover")}if(this.className.indexOf("ui-datepicker-next")!=-1){$(this).addClass("ui-datepicker-next-hover")}}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();var numMonths=this._getNumberOfMonths(inst);var cols=numMonths[1];var width=17;if(cols>1){inst.dpDiv.addClass("ui-datepicker-multi-"+cols).css("width",(width*cols)+"em")}else{inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("")}inst.dpDiv[(numMonths[0]!=1||numMonths[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");inst.dpDiv[(this._get(inst,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");if(inst.input&&inst.input[0].type!="hidden"&&inst==$.datepicker._curInst){$(inst.input[0]).focus()}},_checkOffset:function(inst,offset,isFixed){var dpWidth=inst.dpDiv.outerWidth();var dpHeight=inst.dpDiv.outerHeight();var inputWidth=inst.input?inst.input.outerWidth():0;var inputHeight=inst.input?inst.input.outerHeight():0;var viewWidth=(window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth)+$(document).scrollLeft();var viewHeight=(window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight)+$(document).scrollTop();offset.left-=(this._get(inst,"isRTL")?(dpWidth-inputWidth):0);offset.left-=(isFixed&&offset.left==inst.input.offset().left)?$(document).scrollLeft():0;offset.top-=(isFixed&&offset.top==(inst.input.offset().top+inputHeight))?$(document).scrollTop():0;offset.left-=(offset.left+dpWidth>viewWidth&&viewWidth>dpWidth)?Math.abs(offset.left+dpWidth-viewWidth):0;offset.top-=(offset.top+dpHeight>viewHeight&&viewHeight>dpHeight)?Math.abs(offset.top+dpHeight+inputHeight*2-viewHeight):0;return offset},_findPos:function(obj){while(obj&&(obj.type=="hidden"||obj.nodeType!=1)){obj=obj.nextSibling}var position=$(obj).offset();return[position.left,position.top]},_hideDatepicker:function(input,duration){var inst=this._curInst;if(!inst||(input&&inst!=$.data(input,PROP_NAME))){return}if(inst.stayOpen){this._selectDate("#"+inst.id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear))}inst.stayOpen=false;if(this._datepickerShowing){duration=(duration!=null?duration:this._get(inst,"duration"));var showAnim=this._get(inst,"showAnim");var postProcess=function(){$.datepicker._tidyDialog(inst)};if(duration!=""&&$.effects&&$.effects[showAnim]){inst.dpDiv.hide(showAnim,$.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[(duration==""?"hide":(showAnim=="slideDown"?"slideUp":(showAnim=="fadeIn"?"fadeOut":"hide")))](duration,postProcess)}if(duration==""){this._tidyDialog(inst)}var onClose=this._get(inst,"onClose");if(onClose){onClose.apply((inst.input?inst.input[0]:null),[(inst.input?inst.input.val():""),inst])}this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if($.blockUI){$.unblockUI();$("body").append(this.dpDiv)}}this._inDialog=false}this._curInst=null},_tidyDialog:function(inst){inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(event){if(!$.datepicker._curInst){return}var $target=$(event.target);if(($target.parents("#"+$.datepicker._mainDivId).length==0)&&!$target.hasClass($.datepicker.markerClassName)&&!$target.hasClass($.datepicker._triggerClass)&&$.datepicker._datepickerShowing&&!($.datepicker._inDialog&&$.blockUI)){$.datepicker._hideDatepicker(null,"")}},_adjustDate:function(id,offset,period){var target=$(id);var inst=this._getInst(target[0]);if(this._isDisabledDatepicker(target[0])){return}this._adjustInstDate(inst,offset+(period=="M"?this._get(inst,"showCurrentAtPos"):0),period);this._updateDatepicker(inst)},_gotoToday:function(id){var target=$(id);var inst=this._getInst(target[0]);if(this._get(inst,"gotoCurrent")&&inst.currentDay){inst.selectedDay=inst.currentDay;inst.drawMonth=inst.selectedMonth=inst.currentMonth;inst.drawYear=inst.selectedYear=inst.currentYear}else{var date=new Date();inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear()}this._notifyChange(inst);this._adjustDate(target)},_selectMonthYear:function(id,select,period){var target=$(id);var inst=this._getInst(target[0]);inst._selectingMonthYear=false;inst["selected"+(period=="M"?"Month":"Year")]=inst["draw"+(period=="M"?"Month":"Year")]=parseInt(select.options[select.selectedIndex].value,10);this._notifyChange(inst);this._adjustDate(target)},_clickMonthYear:function(id){var target=$(id);var inst=this._getInst(target[0]);if(inst.input&&inst._selectingMonthYear&&!$.browser.msie){inst.input[0].focus()}inst._selectingMonthYear=!inst._selectingMonthYear},_selectDay:function(id,month,year,td){var target=$(id);if($(td).hasClass(this._unselectableClass)||this._isDisabledDatepicker(target[0])){return}var inst=this._getInst(target[0]);inst.selectedDay=inst.currentDay=$("a",td).html();inst.selectedMonth=inst.currentMonth=month;inst.selectedYear=inst.currentYear=year;if(inst.stayOpen){inst.endDay=inst.endMonth=inst.endYear=null}this._selectDate(id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear));if(inst.stayOpen){inst.rangeStart=this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay));this._updateDatepicker(inst)}},_clearDate:function(id){var target=$(id);var inst=this._getInst(target[0]);inst.stayOpen=false;inst.endDay=inst.endMonth=inst.endYear=inst.rangeStart=null;this._selectDate(target,"")},_selectDate:function(id,dateStr){var target=$(id);var inst=this._getInst(target[0]);dateStr=(dateStr!=null?dateStr:this._formatDate(inst));if(inst.input){inst.input.val(dateStr)}this._updateAlternate(inst);var onSelect=this._get(inst,"onSelect");if(onSelect){onSelect.apply((inst.input?inst.input[0]:null),[dateStr,inst])}else{if(inst.input){inst.input.trigger("change")}}if(inst.inline){this._updateDatepicker(inst)}else{if(!inst.stayOpen){this._hideDatepicker(null,this._get(inst,"duration"));this._lastInput=inst.input[0];if(typeof(inst.input[0])!="object"){inst.input[0].focus()}this._lastInput=null}}},_updateAlternate:function(inst){var altField=this._get(inst,"altField");if(altField){var altFormat=this._get(inst,"altFormat")||this._get(inst,"dateFormat");var date=this._getDate(inst);dateStr=this.formatDate(altFormat,date,this._getFormatConfig(inst));$(altField).each(function(){$(this).val(dateStr)})}},noWeekends:function(date){var day=date.getDay();return[(day>0&&day<6),""]},iso8601Week:function(date){var checkDate=new Date(date.getFullYear(),date.getMonth(),date.getDate());var firstMon=new Date(checkDate.getFullYear(),1-1,4);var firstDay=firstMon.getDay()||7;firstMon.setDate(firstMon.getDate()+1-firstDay);if(firstDay<4&&checkDate<firstMon){checkDate.setDate(checkDate.getDate()-3);return $.datepicker.iso8601Week(checkDate)}else{if(checkDate>new Date(checkDate.getFullYear(),12-1,28)){firstDay=new Date(checkDate.getFullYear()+1,1-1,4).getDay()||7;if(firstDay>4&&(checkDate.getDay()||7)<firstDay-3){return 1}}}return Math.floor(((checkDate-firstMon)/86400000)/7)+1},parseDate:function(format,value,settings){if(format==null||value==null){throw"Invalid arguments"}value=(typeof value=="object"?value.toString():value+"");if(value==""){return null}var shortYearCutoff=(settings?settings.shortYearCutoff:null)||this._defaults.shortYearCutoff;var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;var year=-1;var month=-1;var day=-1;var doy=-1;var literal=false;var lookAhead=function(match){var matches=(iFormat+1<format.length&&format.charAt(iFormat+1)==match);if(matches){iFormat++}return matches};var getNumber=function(match){lookAhead(match);var origSize=(match=="@"?14:(match=="y"?4:(match=="o"?3:2)));var size=origSize;var num=0;while(size>0&&iValue<value.length&&value.charAt(iValue)>="0"&&value.charAt(iValue)<="9"){num=num*10+parseInt(value.charAt(iValue++),10);size--}if(size==origSize){throw"Missing number at position "+iValue}return num};var getName=function(match,shortNames,longNames){var names=(lookAhead(match)?longNames:shortNames);var size=0;for(var j=0;j<names.length;j++){size=Math.max(size,names[j].length)}var name="";var iInit=iValue;while(size>0&&iValue<value.length){name+=value.charAt(iValue++);for(var i=0;i<names.length;i++){if(name==names[i]){return i+1}}size--}throw"Unknown name at position "+iInit};var checkLiteral=function(){if(value.charAt(iValue)!=format.charAt(iFormat)){throw"Unexpected literal at position "+iValue}iValue++};var iValue=0;for(var iFormat=0;iFormat<format.length;iFormat++){if(literal){if(format.charAt(iFormat)=="'"&&!lookAhead("'")){literal=false}else{checkLiteral()}}else{switch(format.charAt(iFormat)){case"d":day=getNumber("d");break;case"D":getName("D",dayNamesShort,dayNames);break;case"o":doy=getNumber("o");break;case"m":month=getNumber("m");break;case"M":month=getName("M",monthNamesShort,monthNames);break;case"y":year=getNumber("y");break;case"@":var date=new Date(getNumber("@"));year=date.getFullYear();month=date.getMonth()+1;day=date.getDate();break;case"'":if(lookAhead("'")){checkLiteral()}else{literal=true}break;default:checkLiteral()}}}if(year==-1){year=new Date().getFullYear()}else{if(year<100){year+=new Date().getFullYear()-new Date().getFullYear()%100+(year<=shortYearCutoff?0:-100)}}if(doy>-1){month=1;day=doy;do{var dim=this._getDaysInMonth(year,month-1);if(day<=dim){break}month++;day-=dim}while(true)}var date=this._daylightSavingAdjust(new Date(year,month-1,day));if(date.getFullYear()!=year||date.getMonth()+1!=month||date.getDate()!=day){throw"Invalid date"}return date},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TIMESTAMP:"@",W3C:"yy-mm-dd",formatDate:function(format,date,settings){if(!date){return""}var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;var lookAhead=function(match){var matches=(iFormat+1<format.length&&format.charAt(iFormat+1)==match);if(matches){iFormat++}return matches};var formatNumber=function(match,value,len){var num=""+value;if(lookAhead(match)){while(num.length<len){num="0"+num}}return num};var formatName=function(match,value,shortNames,longNames){return(lookAhead(match)?longNames[value]:shortNames[value])};var output="";var literal=false;if(date){for(var iFormat=0;iFormat<format.length;iFormat++){if(literal){if(format.charAt(iFormat)=="'"&&!lookAhead("'")){literal=false}else{output+=format.charAt(iFormat)}}else{switch(format.charAt(iFormat)){case"d":output+=formatNumber("d",date.getDate(),2);break;case"D":output+=formatName("D",date.getDay(),dayNamesShort,dayNames);break;case"o":var doy=date.getDate();for(var m=date.getMonth()-1;m>=0;m--){doy+=this._getDaysInMonth(date.getFullYear(),m)}output+=formatNumber("o",doy,3);break;case"m":output+=formatNumber("m",date.getMonth()+1,2);break;case"M":output+=formatName("M",date.getMonth(),monthNamesShort,monthNames);break;case"y":output+=(lookAhead("y")?date.getFullYear():(date.getYear()%100<10?"0":"")+date.getYear()%100);break;case"@":output+=date.getTime();break;case"'":if(lookAhead("'")){output+="'"}else{literal=true}break;default:output+=format.charAt(iFormat)}}}}return output},_possibleChars:function(format){var chars="";var literal=false;for(var iFormat=0;iFormat<format.length;iFormat++){if(literal){if(format.charAt(iFormat)=="'"&&!lookAhead("'")){literal=false}else{chars+=format.charAt(iFormat)}}else{switch(format.charAt(iFormat)){case"d":case"m":case"y":case"@":chars+="0123456789";break;case"D":case"M":return null;case"'":if(lookAhead("'")){chars+="'"}else{literal=true}break;default:chars+=format.charAt(iFormat)}}}return chars},_get:function(inst,name){return inst.settings[name]!==undefined?inst.settings[name]:this._defaults[name]},_setDateFromField:function(inst){var dateFormat=this._get(inst,"dateFormat");var dates=inst.input?inst.input.val():null;inst.endDay=inst.endMonth=inst.endYear=null;var date=defaultDate=this._getDefaultDate(inst);var settings=this._getFormatConfig(inst);try{date=this.parseDate(dateFormat,dates,settings)||defaultDate}catch(event){this.log(event);date=defaultDate}inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear();inst.currentDay=(dates?date.getDate():0);inst.currentMonth=(dates?date.getMonth():0);inst.currentYear=(dates?date.getFullYear():0);this._adjustInstDate(inst)},_getDefaultDate:function(inst){var date=this._determineDate(this._get(inst,"defaultDate"),new Date());var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");date=(minDate&&date<minDate?minDate:date);date=(maxDate&&date>maxDate?maxDate:date);return date},_determineDate:function(date,defaultDate){var offsetNumeric=function(offset){var date=new Date();date.setDate(date.getDate()+offset);return date};var offsetString=function(offset,getDaysInMonth){var date=new Date();var year=date.getFullYear();var month=date.getMonth();var day=date.getDate();var pattern=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;var matches=pattern.exec(offset);while(matches){switch(matches[2]||"d"){case"d":case"D":day+=parseInt(matches[1],10);break;case"w":case"W":day+=parseInt(matches[1],10)*7;break;case"m":case"M":month+=parseInt(matches[1],10);day=Math.min(day,getDaysInMonth(year,month));break;case"y":case"Y":year+=parseInt(matches[1],10);day=Math.min(day,getDaysInMonth(year,month));break}matches=pattern.exec(offset)}return new Date(year,month,day)};date=(date==null?defaultDate:(typeof date=="string"?offsetString(date,this._getDaysInMonth):(typeof date=="number"?(isNaN(date)?defaultDate:offsetNumeric(date)):date)));date=(date&&date.toString()=="Invalid Date"?defaultDate:date);if(date){date.setHours(0);date.setMinutes(0);date.setSeconds(0);date.setMilliseconds(0)}return this._daylightSavingAdjust(date)},_daylightSavingAdjust:function(date){if(!date){return null}date.setHours(date.getHours()>12?date.getHours()+2:0);return date},_setDate:function(inst,date,endDate){var clear=!(date);var origMonth=inst.selectedMonth;var origYear=inst.selectedYear;date=this._determineDate(date,new Date());inst.selectedDay=inst.currentDay=date.getDate();inst.drawMonth=inst.selectedMonth=inst.currentMonth=date.getMonth();inst.drawYear=inst.selectedYear=inst.currentYear=date.getFullYear();if(origMonth!=inst.selectedMonth||origYear!=inst.selectedYear){this._notifyChange(inst)}this._adjustInstDate(inst);if(inst.input){inst.input.val(clear?"":this._formatDate(inst))}},_getDate:function(inst){var startDate=(!inst.currentYear||(inst.input&&inst.input.val()=="")?null:this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));return startDate},_generateHTML:function(inst){var today=new Date();today=this._daylightSavingAdjust(new Date(today.getFullYear(),today.getMonth(),today.getDate()));var isRTL=this._get(inst,"isRTL");var showButtonPanel=this._get(inst,"showButtonPanel");var hideIfNoPrevNext=this._get(inst,"hideIfNoPrevNext");var navigationAsDateFormat=this._get(inst,"navigationAsDateFormat");var numMonths=this._getNumberOfMonths(inst);var showCurrentAtPos=this._get(inst,"showCurrentAtPos");var stepMonths=this._get(inst,"stepMonths");var stepBigMonths=this._get(inst,"stepBigMonths");var isMultiMonth=(numMonths[0]!=1||numMonths[1]!=1);var currentDate=this._daylightSavingAdjust((!inst.currentDay?new Date(9999,9,9):new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");var drawMonth=inst.drawMonth-showCurrentAtPos;var drawYear=inst.drawYear;if(drawMonth<0){drawMonth+=12;drawYear--}if(maxDate){var maxDraw=this._daylightSavingAdjust(new Date(maxDate.getFullYear(),maxDate.getMonth()-numMonths[1]+1,maxDate.getDate()));maxDraw=(minDate&&maxDraw<minDate?minDate:maxDraw);while(this._daylightSavingAdjust(new Date(drawYear,drawMonth,1))>maxDraw){drawMonth--;if(drawMonth<0){drawMonth=11;drawYear--}}}inst.drawMonth=drawMonth;inst.drawYear=drawYear;var prevText=this._get(inst,"prevText");prevText=(!navigationAsDateFormat?prevText:this.formatDate(prevText,this._daylightSavingAdjust(new Date(drawYear,drawMonth-stepMonths,1)),this._getFormatConfig(inst)));var prev=(this._canAdjustMonth(inst,-1,drawYear,drawMonth)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery.datepicker._adjustDate(\'#'+inst.id+"', -"+stepMonths+", 'M');\" title=\""+prevText+'"><span class="ui-icon ui-icon-circle-triangle-'+(isRTL?"e":"w")+'">'+prevText+"</span></a>":(hideIfNoPrevNext?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+prevText+'"><span class="ui-icon ui-icon-circle-triangle-'+(isRTL?"e":"w")+'">'+prevText+"</span></a>"));var nextText=this._get(inst,"nextText");nextText=(!navigationAsDateFormat?nextText:this.formatDate(nextText,this._daylightSavingAdjust(new Date(drawYear,drawMonth+stepMonths,1)),this._getFormatConfig(inst)));var next=(this._canAdjustMonth(inst,+1,drawYear,drawMonth)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery.datepicker._adjustDate(\'#'+inst.id+"', +"+stepMonths+", 'M');\" title=\""+nextText+'"><span class="ui-icon ui-icon-circle-triangle-'+(isRTL?"w":"e")+'">'+nextText+"</span></a>":(hideIfNoPrevNext?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+nextText+'"><span class="ui-icon ui-icon-circle-triangle-'+(isRTL?"w":"e")+'">'+nextText+"</span></a>"));var currentText=this._get(inst,"currentText");var gotoDate=(this._get(inst,"gotoCurrent")&&inst.currentDay?currentDate:today);currentText=(!navigationAsDateFormat?currentText:this.formatDate(currentText,gotoDate,this._getFormatConfig(inst)));var controls=(!inst.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery.datepicker._hideDatepicker();">'+this._get(inst,"closeText")+"</button>":"");var buttonPanel=(showButtonPanel)?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(isRTL?controls:"")+(this._isInRange(inst,gotoDate)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery.datepicker._gotoToday(\'#'+inst.id+"');\">"+currentText+"</button>":"")+(isRTL?"":controls)+"</div>":"";var firstDay=parseInt(this._get(inst,"firstDay"),10);firstDay=(isNaN(firstDay)?0:firstDay);var dayNames=this._get(inst,"dayNames");var dayNamesShort=this._get(inst,"dayNamesShort");var dayNamesMin=this._get(inst,"dayNamesMin");var monthNames=this._get(inst,"monthNames");var monthNamesShort=this._get(inst,"monthNamesShort");var beforeShowDay=this._get(inst,"beforeShowDay");var showOtherMonths=this._get(inst,"showOtherMonths");var calculateWeek=this._get(inst,"calculateWeek")||this.iso8601Week;var endDate=inst.endDay?this._daylightSavingAdjust(new Date(inst.endYear,inst.endMonth,inst.endDay)):currentDate;var defaultDate=this._getDefaultDate(inst);var html="";for(var row=0;row<numMonths[0];row++){var group="";for(var col=0;col<numMonths[1];col++){var selectedDate=this._daylightSavingAdjust(new Date(drawYear,drawMonth,inst.selectedDay));var cornerClass=" ui-corner-all";var calender="";if(isMultiMonth){calender+='<div class="ui-datepicker-group ui-datepicker-group-';switch(col){case 0:calender+="first";cornerClass=" ui-corner-"+(isRTL?"right":"left");break;case numMonths[1]-1:calender+="last";cornerClass=" ui-corner-"+(isRTL?"left":"right");break;default:calender+="middle";cornerClass="";break}calender+='">'}calender+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+cornerClass+'">'+(/all|left/.test(cornerClass)&&row==0?(isRTL?next:prev):"")+(/all|right/.test(cornerClass)&&row==0?(isRTL?prev:next):"")+this._generateMonthYearHeader(inst,drawMonth,drawYear,minDate,maxDate,selectedDate,row>0||col>0,monthNames,monthNamesShort)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var thead="";for(var dow=0;dow<7;dow++){var day=(dow+firstDay)%7;thead+="<th"+((dow+firstDay+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+dayNames[day]+'">'+dayNamesMin[day]+"</span></th>"}calender+=thead+"</tr></thead><tbody>";var daysInMonth=this._getDaysInMonth(drawYear,drawMonth);if(drawYear==inst.selectedYear&&drawMonth==inst.selectedMonth){inst.selectedDay=Math.min(inst.selectedDay,daysInMonth)}var leadDays=(this._getFirstDayOfMonth(drawYear,drawMonth)-firstDay+7)%7;var numRows=(isMultiMonth?6:Math.ceil((leadDays+daysInMonth)/7));var printDate=this._daylightSavingAdjust(new Date(drawYear,drawMonth,1-leadDays));for(var dRow=0;dRow<numRows;dRow++){calender+="<tr>";var tbody="";for(var dow=0;dow<7;dow++){var daySettings=(beforeShowDay?beforeShowDay.apply((inst.input?inst.input[0]:null),[printDate]):[true,""]);var otherMonth=(printDate.getMonth()!=drawMonth);var unselectable=otherMonth||!daySettings[0]||(minDate&&printDate<minDate)||(maxDate&&printDate>maxDate);tbody+='<td class="'+((dow+firstDay+6)%7>=5?" ui-datepicker-week-end":"")+(otherMonth?" ui-datepicker-other-month":"")+((printDate.getTime()==selectedDate.getTime()&&drawMonth==inst.selectedMonth&&inst._keyEvent)||(defaultDate.getTime()==printDate.getTime()&&defaultDate.getTime()==selectedDate.getTime())?" "+this._dayOverClass:"")+(unselectable?" "+this._unselectableClass+" ui-state-disabled":"")+(otherMonth&&!showOtherMonths?"":" "+daySettings[1]+(printDate.getTime()>=currentDate.getTime()&&printDate.getTime()<=endDate.getTime()?" "+this._currentClass:"")+(printDate.getTime()==today.getTime()?" ui-datepicker-today":""))+'"'+((!otherMonth||showOtherMonths)&&daySettings[2]?' title="'+daySettings[2]+'"':"")+(unselectable?"":" onclick=\"DP_jQuery.datepicker._selectDay('#"+inst.id+"',"+drawMonth+","+drawYear+', this);return false;"')+">"+(otherMonth?(showOtherMonths?printDate.getDate():"&#xa0;"):(unselectable?'<span class="ui-state-default">'+printDate.getDate()+"</span>":'<a class="ui-state-default'+(printDate.getTime()==today.getTime()?" ui-state-highlight":"")+(printDate.getTime()>=currentDate.getTime()&&printDate.getTime()<=endDate.getTime()?" ui-state-active":"")+'" href="#">'+printDate.getDate()+"</a>"))+"</td>";printDate.setDate(printDate.getDate()+1);printDate=this._daylightSavingAdjust(printDate)}calender+=tbody+"</tr>"}drawMonth++;if(drawMonth>11){drawMonth=0;drawYear++}calender+="</tbody></table>"+(isMultiMonth?"</div>"+((numMonths[0]>0&&col==numMonths[1]-1)?'<div class="ui-datepicker-row-break"></div>':""):"");group+=calender}html+=group}html+=buttonPanel+($.browser.msie&&parseInt($.browser.version,10)<7&&!inst.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':"");inst._keyEvent=false;return html},_generateMonthYearHeader:function(inst,drawMonth,drawYear,minDate,maxDate,selectedDate,secondary,monthNames,monthNamesShort){minDate=(inst.rangeStart&&minDate&&selectedDate<minDate?selectedDate:minDate);var changeMonth=this._get(inst,"changeMonth");var changeYear=this._get(inst,"changeYear");var showMonthAfterYear=this._get(inst,"showMonthAfterYear");var html='<div class="ui-datepicker-title">';var monthHtml="";if(secondary||!changeMonth){monthHtml+='<span class="ui-datepicker-month">'+monthNames[drawMonth]+"</span> "}else{var inMinYear=(minDate&&minDate.getFullYear()==drawYear);var inMaxYear=(maxDate&&maxDate.getFullYear()==drawYear);monthHtml+='<select class="ui-datepicker-month" onchange="DP_jQuery.datepicker._selectMonthYear(\'#'+inst.id+"', this, 'M');\" onclick=\"DP_jQuery.datepicker._clickMonthYear('#"+inst.id+"');\">";for(var month=0;month<12;month++){if((!inMinYear||month>=minDate.getMonth())&&(!inMaxYear||month<=maxDate.getMonth())){monthHtml+='<option value="'+month+'"'+(month==drawMonth?' selected="selected"':"")+">"+monthNamesShort[month]+"</option>"}}monthHtml+="</select>"}if(!showMonthAfterYear){html+=monthHtml+((secondary||changeMonth||changeYear)&&(!(changeMonth&&changeYear))?"&#xa0;":"")}if(secondary||!changeYear){html+='<span class="ui-datepicker-year">'+drawYear+"</span>"}else{var years=this._get(inst,"yearRange").split(":");var year=0;var endYear=0;if(years.length!=2){year=drawYear-10;endYear=drawYear+10}else{if(years[0].charAt(0)=="+"||years[0].charAt(0)=="-"){year=drawYear+parseInt(years[0],10);endYear=drawYear+parseInt(years[1],10)}else{year=parseInt(years[0],10);endYear=parseInt(years[1],10)}}year=(minDate?Math.max(year,minDate.getFullYear()):year);endYear=(maxDate?Math.min(endYear,maxDate.getFullYear()):endYear);html+='<select class="ui-datepicker-year" onchange="DP_jQuery.datepicker._selectMonthYear(\'#'+inst.id+"', this, 'Y');\" onclick=\"DP_jQuery.datepicker._clickMonthYear('#"+inst.id+"');\">";for(;year<=endYear;year++){html+='<option value="'+year+'"'+(year==drawYear?' selected="selected"':"")+">"+year+"</option>"}html+="</select>"}if(showMonthAfterYear){html+=(secondary||changeMonth||changeYear?"&#xa0;":"")+monthHtml}html+="</div>";return html},_adjustInstDate:function(inst,offset,period){var year=inst.drawYear+(period=="Y"?offset:0);var month=inst.drawMonth+(period=="M"?offset:0);var day=Math.min(inst.selectedDay,this._getDaysInMonth(year,month))+(period=="D"?offset:0);var date=this._daylightSavingAdjust(new Date(year,month,day));var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");date=(minDate&&date<minDate?minDate:date);date=(maxDate&&date>maxDate?maxDate:date);inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear();if(period=="M"||period=="Y"){this._notifyChange(inst)}},_notifyChange:function(inst){var onChange=this._get(inst,"onChangeMonthYear");if(onChange){onChange.apply((inst.input?inst.input[0]:null),[inst.selectedYear,inst.selectedMonth+1,inst])}},_getNumberOfMonths:function(inst){var numMonths=this._get(inst,"numberOfMonths");return(numMonths==null?[1,1]:(typeof numMonths=="number"?[1,numMonths]:numMonths))},_getMinMaxDate:function(inst,minMax,checkRange){var date=this._determineDate(this._get(inst,minMax+"Date"),null);return(!checkRange||!inst.rangeStart?date:(!date||inst.rangeStart>date?inst.rangeStart:date))},_getDaysInMonth:function(year,month){return 32-new Date(year,month,32).getDate()},_getFirstDayOfMonth:function(year,month){return new Date(year,month,1).getDay()},_canAdjustMonth:function(inst,offset,curYear,curMonth){var numMonths=this._getNumberOfMonths(inst);var date=this._daylightSavingAdjust(new Date(curYear,curMonth+(offset<0?offset:numMonths[1]),1));if(offset<0){date.setDate(this._getDaysInMonth(date.getFullYear(),date.getMonth()))}return this._isInRange(inst,date)},_isInRange:function(inst,date){var newMinDate=(!inst.rangeStart?null:this._daylightSavingAdjust(new Date(inst.selectedYear,inst.selectedMonth,inst.selectedDay)));newMinDate=(newMinDate&&inst.rangeStart<newMinDate?inst.rangeStart:newMinDate);var minDate=newMinDate||this._getMinMaxDate(inst,"min");var maxDate=this._getMinMaxDate(inst,"max");return((!minDate||date>=minDate)&&(!maxDate||date<=maxDate))},_getFormatConfig:function(inst){var shortYearCutoff=this._get(inst,"shortYearCutoff");shortYearCutoff=(typeof shortYearCutoff!="string"?shortYearCutoff:new Date().getFullYear()%100+parseInt(shortYearCutoff,10));return{shortYearCutoff:shortYearCutoff,dayNamesShort:this._get(inst,"dayNamesShort"),dayNames:this._get(inst,"dayNames"),monthNamesShort:this._get(inst,"monthNamesShort"),monthNames:this._get(inst,"monthNames")}},_formatDate:function(inst,day,month,year){if(!day){inst.currentDay=inst.selectedDay;inst.currentMonth=inst.selectedMonth;inst.currentYear=inst.selectedYear}var date=(day?(typeof day=="object"?day:this._daylightSavingAdjust(new Date(year,month,day))):this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));return this.formatDate(this._get(inst,"dateFormat"),date,this._getFormatConfig(inst))}});function extendRemove(target,props){$.extend(target,props);for(var name in props){if(props[name]==null||props[name]==undefined){target[name]=props[name]}}return target}function isArray(a){return(a&&(($.browser.safari&&typeof a=="object"&&a.length)||(a.constructor&&a.constructor.toString().match(/\Array\(\)/))))}$.fn.datepicker=function(options){if(!$.datepicker.initialized){$(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv);$.datepicker.initialized=true}var otherArgs=Array.prototype.slice.call(arguments,1);if(typeof options=="string"&&(options=="isDisabled"||options=="getDate")){return $.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this[0]].concat(otherArgs))}if(options=="option"&&arguments.length==2&&typeof arguments[1]=="string"){return $.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this[0]].concat(otherArgs))}return this.each(function(){typeof options=="string"?$.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this].concat(otherArgs)):$.datepicker._attachDatepicker(this,options)})};$.datepicker=new Datepicker();$.datepicker.initialized=false;$.datepicker.uuid=new Date().getTime();$.datepicker.version="1.7.3";window.DP_jQuery=$})(jQuery);;/*
 * jQuery UI Progressbar 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Progressbar
 *
 * Depends:
 *   ui.core.js
 */
(function(a){a.widget("ui.progressbar",{_init:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this._valueMin(),"aria-valuemax":this._valueMax(),"aria-valuenow":this._value()});this.valueDiv=a('<div class="ui-progressbar-value ui-widget-header ui-corner-left"></div>').appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow").removeData("progressbar").unbind(".progressbar");this.valueDiv.remove();a.widget.prototype.destroy.apply(this,arguments)},value:function(b){if(b===undefined){return this._value()}this._setData("value",b);return this},_setData:function(b,c){switch(b){case"value":this.options.value=c;this._refreshValue();this._trigger("change",null,{});break}a.widget.prototype._setData.apply(this,arguments)},_value:function(){var b=this.options.value;if(b<this._valueMin()){b=this._valueMin()}if(b>this._valueMax()){b=this._valueMax()}return b},_valueMin:function(){var b=0;return b},_valueMax:function(){var b=100;return b},_refreshValue:function(){var b=this.value();this.valueDiv[b==this._valueMax()?"addClass":"removeClass"]("ui-corner-right");this.valueDiv.width(b+"%");this.element.attr("aria-valuenow",b)}});a.extend(a.ui.progressbar,{version:"1.7.3",defaults:{value:0}})})(jQuery);;/*
 * jQuery UI Effects 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/
 */
jQuery.effects||(function(d){d.effects={version:"1.7.3",save:function(g,h){for(var f=0;f<h.length;f++){if(h[f]!==null){g.data("ec.storage."+h[f],g[0].style[h[f]])}}},restore:function(g,h){for(var f=0;f<h.length;f++){if(h[f]!==null){g.css(h[f],g.data("ec.storage."+h[f]))}}},setMode:function(f,g){if(g=="toggle"){g=f.is(":hidden")?"show":"hide"}return g},getBaseline:function(g,h){var i,f;switch(g[0]){case"top":i=0;break;case"middle":i=0.5;break;case"bottom":i=1;break;default:i=g[0]/h.height}switch(g[1]){case"left":f=0;break;case"center":f=0.5;break;case"right":f=1;break;default:f=g[1]/h.width}return{x:f,y:i}},createWrapper:function(f){if(f.parent().is(".ui-effects-wrapper")){return f.parent()}var g={width:f.outerWidth(true),height:f.outerHeight(true),"float":f.css("float")};f.wrap('<div class="ui-effects-wrapper" style="font-size:100%;background:transparent;border:none;margin:0;padding:0"></div>');var j=f.parent();if(f.css("position")=="static"){j.css({position:"relative"});f.css({position:"relative"})}else{var i=f.css("top");if(isNaN(parseInt(i,10))){i="auto"}var h=f.css("left");if(isNaN(parseInt(h,10))){h="auto"}j.css({position:f.css("position"),top:i,left:h,zIndex:f.css("z-index")}).show();f.css({position:"relative",top:0,left:0})}j.css(g);return j},removeWrapper:function(f){if(f.parent().is(".ui-effects-wrapper")){return f.parent().replaceWith(f)}return f},setTransition:function(g,i,f,h){h=h||{};d.each(i,function(k,j){unit=g.cssUnit(j);if(unit[0]>0){h[j]=unit[0]*f+unit[1]}});return h},animateClass:function(h,i,k,j){var f=(typeof k=="function"?k:(j?j:null));var g=(typeof k=="string"?k:null);return this.each(function(){var q={};var o=d(this);var p=o.attr("style")||"";if(typeof p=="object"){p=p.cssText}if(h.toggle){o.hasClass(h.toggle)?h.remove=h.toggle:h.add=h.toggle}var l=d.extend({},(document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle));if(h.add){o.addClass(h.add)}if(h.remove){o.removeClass(h.remove)}var m=d.extend({},(document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle));if(h.add){o.removeClass(h.add)}if(h.remove){o.addClass(h.remove)}for(var r in m){if(typeof m[r]!="function"&&m[r]&&r.indexOf("Moz")==-1&&r.indexOf("length")==-1&&m[r]!=l[r]&&(r.match(/color/i)||(!r.match(/color/i)&&!isNaN(parseInt(m[r],10))))&&(l.position!="static"||(l.position=="static"&&!r.match(/left|top|bottom|right/)))){q[r]=m[r]}}o.animate(q,i,g,function(){if(typeof d(this).attr("style")=="object"){d(this).attr("style")["cssText"]="";d(this).attr("style")["cssText"]=p}else{d(this).attr("style",p)}if(h.add){d(this).addClass(h.add)}if(h.remove){d(this).removeClass(h.remove)}if(f){f.apply(this,arguments)}})})}};function c(g,f){var i=g[1]&&g[1].constructor==Object?g[1]:{};if(f){i.mode=f}var h=g[1]&&g[1].constructor!=Object?g[1]:(i.duration?i.duration:g[2]);h=d.fx.off?0:typeof h==="number"?h:d.fx.speeds[h]||d.fx.speeds._default;var j=i.callback||(d.isFunction(g[1])&&g[1])||(d.isFunction(g[2])&&g[2])||(d.isFunction(g[3])&&g[3]);return[g[0],i,h,j]}d.fn.extend({_show:d.fn.show,_hide:d.fn.hide,__toggle:d.fn.toggle,_addClass:d.fn.addClass,_removeClass:d.fn.removeClass,_toggleClass:d.fn.toggleClass,effect:function(g,f,h,i){return d.effects[g]?d.effects[g].call(this,{method:g,options:f||{},duration:h,callback:i}):null},show:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))){return this._show.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"show"))}},hide:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))){return this._hide.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"hide"))}},toggle:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))||(d.isFunction(arguments[0])||typeof arguments[0]=="boolean")){return this.__toggle.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"toggle"))}},addClass:function(g,f,i,h){return f?d.effects.animateClass.apply(this,[{add:g},f,i,h]):this._addClass(g)},removeClass:function(g,f,i,h){return f?d.effects.animateClass.apply(this,[{remove:g},f,i,h]):this._removeClass(g)},toggleClass:function(g,f,i,h){return((typeof f!=="boolean")&&f)?d.effects.animateClass.apply(this,[{toggle:g},f,i,h]):this._toggleClass(g,f)},morph:function(f,h,g,j,i){return d.effects.animateClass.apply(this,[{add:h,remove:f},g,j,i])},switchClass:function(){return this.morph.apply(this,arguments)},cssUnit:function(f){var g=this.css(f),h=[];d.each(["em","px","%","pt"],function(j,k){if(g.indexOf(k)>0){h=[parseFloat(g),k]}});return h}});d.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(g,f){d.fx.step[f]=function(h){if(h.state==0){h.start=e(h.elem,f);h.end=b(h.end)}h.elem.style[f]="rgb("+[Math.max(Math.min(parseInt((h.pos*(h.end[0]-h.start[0]))+h.start[0],10),255),0),Math.max(Math.min(parseInt((h.pos*(h.end[1]-h.start[1]))+h.start[1],10),255),0),Math.max(Math.min(parseInt((h.pos*(h.end[2]-h.start[2]))+h.start[2],10),255),0)].join(",")+")"}});function b(g){var f;if(g&&g.constructor==Array&&g.length==3){return g}if(f=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(g)){return[parseInt(f[1],10),parseInt(f[2],10),parseInt(f[3],10)]}if(f=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(g)){return[parseFloat(f[1])*2.55,parseFloat(f[2])*2.55,parseFloat(f[3])*2.55]}if(f=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(g)){return[parseInt(f[1],16),parseInt(f[2],16),parseInt(f[3],16)]}if(f=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(g)){return[parseInt(f[1]+f[1],16),parseInt(f[2]+f[2],16),parseInt(f[3]+f[3],16)]}if(f=/rgba\(0, 0, 0, 0\)/.exec(g)){return a.transparent}return a[d.trim(g).toLowerCase()]}function e(h,f){var g;do{g=d.curCSS(h,f);if(g!=""&&g!="transparent"||d.nodeName(h,"body")){break}f="backgroundColor"}while(h=h.parentNode);return b(g)}var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]};d.easing.jswing=d.easing.swing;d.extend(d.easing,{def:"easeOutQuad",swing:function(g,h,f,j,i){return d.easing[d.easing.def](g,h,f,j,i)},easeInQuad:function(g,h,f,j,i){return j*(h/=i)*h+f},easeOutQuad:function(g,h,f,j,i){return -j*(h/=i)*(h-2)+f},easeInOutQuad:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h+f}return -j/2*((--h)*(h-2)-1)+f},easeInCubic:function(g,h,f,j,i){return j*(h/=i)*h*h+f},easeOutCubic:function(g,h,f,j,i){return j*((h=h/i-1)*h*h+1)+f},easeInOutCubic:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h+f}return j/2*((h-=2)*h*h+2)+f},easeInQuart:function(g,h,f,j,i){return j*(h/=i)*h*h*h+f},easeOutQuart:function(g,h,f,j,i){return -j*((h=h/i-1)*h*h*h-1)+f},easeInOutQuart:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h*h+f}return -j/2*((h-=2)*h*h*h-2)+f},easeInQuint:function(g,h,f,j,i){return j*(h/=i)*h*h*h*h+f},easeOutQuint:function(g,h,f,j,i){return j*((h=h/i-1)*h*h*h*h+1)+f},easeInOutQuint:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h*h*h+f}return j/2*((h-=2)*h*h*h*h+2)+f},easeInSine:function(g,h,f,j,i){return -j*Math.cos(h/i*(Math.PI/2))+j+f},easeOutSine:function(g,h,f,j,i){return j*Math.sin(h/i*(Math.PI/2))+f},easeInOutSine:function(g,h,f,j,i){return -j/2*(Math.cos(Math.PI*h/i)-1)+f},easeInExpo:function(g,h,f,j,i){return(h==0)?f:j*Math.pow(2,10*(h/i-1))+f},easeOutExpo:function(g,h,f,j,i){return(h==i)?f+j:j*(-Math.pow(2,-10*h/i)+1)+f},easeInOutExpo:function(g,h,f,j,i){if(h==0){return f}if(h==i){return f+j}if((h/=i/2)<1){return j/2*Math.pow(2,10*(h-1))+f}return j/2*(-Math.pow(2,-10*--h)+2)+f},easeInCirc:function(g,h,f,j,i){return -j*(Math.sqrt(1-(h/=i)*h)-1)+f},easeOutCirc:function(g,h,f,j,i){return j*Math.sqrt(1-(h=h/i-1)*h)+f},easeInOutCirc:function(g,h,f,j,i){if((h/=i/2)<1){return -j/2*(Math.sqrt(1-h*h)-1)+f}return j/2*(Math.sqrt(1-(h-=2)*h)+1)+f},easeInElastic:function(g,i,f,m,l){var j=1.70158;var k=0;var h=m;if(i==0){return f}if((i/=l)==1){return f+m}if(!k){k=l*0.3}if(h<Math.abs(m)){h=m;var j=k/4}else{var j=k/(2*Math.PI)*Math.asin(m/h)}return -(h*Math.pow(2,10*(i-=1))*Math.sin((i*l-j)*(2*Math.PI)/k))+f},easeOutElastic:function(g,i,f,m,l){var j=1.70158;var k=0;var h=m;if(i==0){return f}if((i/=l)==1){return f+m}if(!k){k=l*0.3}if(h<Math.abs(m)){h=m;var j=k/4}else{var j=k/(2*Math.PI)*Math.asin(m/h)}return h*Math.pow(2,-10*i)*Math.sin((i*l-j)*(2*Math.PI)/k)+m+f},easeInOutElastic:function(g,i,f,m,l){var j=1.70158;var k=0;var h=m;if(i==0){return f}if((i/=l/2)==2){return f+m}if(!k){k=l*(0.3*1.5)}if(h<Math.abs(m)){h=m;var j=k/4}else{var j=k/(2*Math.PI)*Math.asin(m/h)}if(i<1){return -0.5*(h*Math.pow(2,10*(i-=1))*Math.sin((i*l-j)*(2*Math.PI)/k))+f}return h*Math.pow(2,-10*(i-=1))*Math.sin((i*l-j)*(2*Math.PI)/k)*0.5+m+f},easeInBack:function(g,h,f,k,j,i){if(i==undefined){i=1.70158}return k*(h/=j)*h*((i+1)*h-i)+f},easeOutBack:function(g,h,f,k,j,i){if(i==undefined){i=1.70158}return k*((h=h/j-1)*h*((i+1)*h+i)+1)+f},easeInOutBack:function(g,h,f,k,j,i){if(i==undefined){i=1.70158}if((h/=j/2)<1){return k/2*(h*h*(((i*=(1.525))+1)*h-i))+f}return k/2*((h-=2)*h*(((i*=(1.525))+1)*h+i)+2)+f},easeInBounce:function(g,h,f,j,i){return j-d.easing.easeOutBounce(g,i-h,0,j,i)+f},easeOutBounce:function(g,h,f,j,i){if((h/=i)<(1/2.75)){return j*(7.5625*h*h)+f}else{if(h<(2/2.75)){return j*(7.5625*(h-=(1.5/2.75))*h+0.75)+f}else{if(h<(2.5/2.75)){return j*(7.5625*(h-=(2.25/2.75))*h+0.9375)+f}else{return j*(7.5625*(h-=(2.625/2.75))*h+0.984375)+f}}}},easeInOutBounce:function(g,h,f,j,i){if(h<i/2){return d.easing.easeInBounce(g,h*2,0,j,i)*0.5+f}return d.easing.easeOutBounce(g,h*2-i,0,j,i)*0.5+j*0.5+f}})})(jQuery);;/*
 * jQuery UI Effects Blind 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Blind
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.blind=function(b){return this.queue(function(){var d=a(this),c=["position","top","left"];var h=a.effects.setMode(d,b.options.mode||"hide");var g=b.options.direction||"vertical";a.effects.save(d,c);d.show();var j=a.effects.createWrapper(d).css({overflow:"hidden"});var e=(g=="vertical")?"height":"width";var i=(g=="vertical")?j.height():j.width();if(h=="show"){j.css(e,0)}var f={};f[e]=h=="show"?i:0;j.animate(f,b.duration,b.options.easing,function(){if(h=="hide"){d.hide()}a.effects.restore(d,c);a.effects.removeWrapper(d);if(b.callback){b.callback.apply(d[0],arguments)}d.dequeue()})})}})(jQuery);;/*
 * jQuery UI Effects Bounce 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Bounce
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.bounce=function(b){return this.queue(function(){var e=a(this),l=["position","top","left"];var k=a.effects.setMode(e,b.options.mode||"effect");var n=b.options.direction||"up";var c=b.options.distance||20;var d=b.options.times||5;var g=b.duration||250;if(/show|hide/.test(k)){l.push("opacity")}a.effects.save(e,l);e.show();a.effects.createWrapper(e);var f=(n=="up"||n=="down")?"top":"left";var p=(n=="up"||n=="left")?"pos":"neg";var c=b.options.distance||(f=="top"?e.outerHeight({margin:true})/3:e.outerWidth({margin:true})/3);if(k=="show"){e.css("opacity",0).css(f,p=="pos"?-c:c)}if(k=="hide"){c=c/(d*2)}if(k!="hide"){d--}if(k=="show"){var h={opacity:1};h[f]=(p=="pos"?"+=":"-=")+c;e.animate(h,g/2,b.options.easing);c=c/2;d--}for(var j=0;j<d;j++){var o={},m={};o[f]=(p=="pos"?"-=":"+=")+c;m[f]=(p=="pos"?"+=":"-=")+c;e.animate(o,g/2,b.options.easing).animate(m,g/2,b.options.easing);c=(k=="hide")?c*2:c/2}if(k=="hide"){var h={opacity:0};h[f]=(p=="pos"?"-=":"+=")+c;e.animate(h,g/2,b.options.easing,function(){e.hide();a.effects.restore(e,l);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(this,arguments)}})}else{var o={},m={};o[f]=(p=="pos"?"-=":"+=")+c;m[f]=(p=="pos"?"+=":"-=")+c;e.animate(o,g/2,b.options.easing).animate(m,g/2,b.options.easing,function(){a.effects.restore(e,l);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(this,arguments)}})}e.queue("fx",function(){e.dequeue()});e.dequeue()})}})(jQuery);;/*
 * jQuery UI Effects Clip 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Clip
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.clip=function(b){return this.queue(function(){var f=a(this),j=["position","top","left","height","width"];var i=a.effects.setMode(f,b.options.mode||"hide");var k=b.options.direction||"vertical";a.effects.save(f,j);f.show();var c=a.effects.createWrapper(f).css({overflow:"hidden"});var e=f[0].tagName=="IMG"?c:f;var g={size:(k=="vertical")?"height":"width",position:(k=="vertical")?"top":"left"};var d=(k=="vertical")?e.height():e.width();if(i=="show"){e.css(g.size,0);e.css(g.position,d/2)}var h={};h[g.size]=i=="show"?d:0;h[g.position]=i=="show"?0:d/2;e.animate(h,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(i=="hide"){f.hide()}a.effects.restore(f,j);a.effects.removeWrapper(f);if(b.callback){b.callback.apply(f[0],arguments)}f.dequeue()}})})}})(jQuery);;/*
 * jQuery UI Effects Drop 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Drop
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.drop=function(b){return this.queue(function(){var e=a(this),d=["position","top","left","opacity"];var i=a.effects.setMode(e,b.options.mode||"hide");var h=b.options.direction||"left";a.effects.save(e,d);e.show();a.effects.createWrapper(e);var f=(h=="up"||h=="down")?"top":"left";var c=(h=="up"||h=="left")?"pos":"neg";var j=b.options.distance||(f=="top"?e.outerHeight({margin:true})/2:e.outerWidth({margin:true})/2);if(i=="show"){e.css("opacity",0).css(f,c=="pos"?-j:j)}var g={opacity:i=="show"?1:0};g[f]=(i=="show"?(c=="pos"?"+=":"-="):(c=="pos"?"-=":"+="))+j;e.animate(g,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(i=="hide"){e.hide()}a.effects.restore(e,d);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(this,arguments)}e.dequeue()}})})}})(jQuery);;/*
 * jQuery UI Effects Explode 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Explode
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.explode=function(b){return this.queue(function(){var k=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3;var e=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3;b.options.mode=b.options.mode=="toggle"?(a(this).is(":visible")?"hide":"show"):b.options.mode;var h=a(this).show().css("visibility","hidden");var l=h.offset();l.top-=parseInt(h.css("marginTop"),10)||0;l.left-=parseInt(h.css("marginLeft"),10)||0;var g=h.outerWidth(true);var c=h.outerHeight(true);for(var f=0;f<k;f++){for(var d=0;d<e;d++){h.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-d*(g/e),top:-f*(c/k)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/e,height:c/k,left:l.left+d*(g/e)+(b.options.mode=="show"?(d-Math.floor(e/2))*(g/e):0),top:l.top+f*(c/k)+(b.options.mode=="show"?(f-Math.floor(k/2))*(c/k):0),opacity:b.options.mode=="show"?0:1}).animate({left:l.left+d*(g/e)+(b.options.mode=="show"?0:(d-Math.floor(e/2))*(g/e)),top:l.top+f*(c/k)+(b.options.mode=="show"?0:(f-Math.floor(k/2))*(c/k)),opacity:b.options.mode=="show"?1:0},b.duration||500)}}setTimeout(function(){b.options.mode=="show"?h.css({visibility:"visible"}):h.css({visibility:"visible"}).hide();if(b.callback){b.callback.apply(h[0])}h.dequeue();a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);;/*
 * jQuery UI Effects Fold 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Fold
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.fold=function(b){return this.queue(function(){var e=a(this),k=["position","top","left"];var h=a.effects.setMode(e,b.options.mode||"hide");var o=b.options.size||15;var n=!(!b.options.horizFirst);var g=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(e,k);e.show();var d=a.effects.createWrapper(e).css({overflow:"hidden"});var i=((h=="show")!=n);var f=i?["width","height"]:["height","width"];var c=i?[d.width(),d.height()]:[d.height(),d.width()];var j=/([0-9]+)%/.exec(o);if(j){o=parseInt(j[1],10)/100*c[h=="hide"?0:1]}if(h=="show"){d.css(n?{height:0,width:o}:{height:o,width:0})}var m={},l={};m[f[0]]=h=="show"?c[0]:o;l[f[1]]=h=="show"?c[1]:0;d.animate(m,g,b.options.easing).animate(l,g,b.options.easing,function(){if(h=="hide"){e.hide()}a.effects.restore(e,k);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(e[0],arguments)}e.dequeue()})})}})(jQuery);;/*
 * jQuery UI Effects Highlight 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Highlight
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.highlight=function(b){return this.queue(function(){var e=a(this),d=["backgroundImage","backgroundColor","opacity"];var h=a.effects.setMode(e,b.options.mode||"show");var c=b.options.color||"#ffff99";var g=e.css("backgroundColor");a.effects.save(e,d);e.show();e.css({backgroundImage:"none",backgroundColor:c});var f={backgroundColor:g};if(h=="hide"){f.opacity=0}e.animate(f,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(h=="hide"){e.hide()}a.effects.restore(e,d);if(h=="show"&&a.browser.msie){this.style.removeAttribute("filter")}if(b.callback){b.callback.apply(this,arguments)}e.dequeue()}})})}})(jQuery);;/*
 * jQuery UI Effects Pulsate 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Pulsate
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.pulsate=function(b){return this.queue(function(){var d=a(this);var g=a.effects.setMode(d,b.options.mode||"show");var f=b.options.times||5;var e=b.duration?b.duration/2:a.fx.speeds._default/2;if(g=="hide"){f--}if(d.is(":hidden")){d.css("opacity",0);d.show();d.animate({opacity:1},e,b.options.easing);f=f-2}for(var c=0;c<f;c++){d.animate({opacity:0},e,b.options.easing).animate({opacity:1},e,b.options.easing)}if(g=="hide"){d.animate({opacity:0},e,b.options.easing,function(){d.hide();if(b.callback){b.callback.apply(this,arguments)}})}else{d.animate({opacity:0},e,b.options.easing).animate({opacity:1},e,b.options.easing,function(){if(b.callback){b.callback.apply(this,arguments)}})}d.queue("fx",function(){d.dequeue()});d.dequeue()})}})(jQuery);;/*
 * jQuery UI Effects Scale 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Scale
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.puff=function(b){return this.queue(function(){var f=a(this);var c=a.extend(true,{},b.options);var h=a.effects.setMode(f,b.options.mode||"hide");var g=parseInt(b.options.percent,10)||150;c.fade=true;var e={height:f.height(),width:f.width()};var d=g/100;f.from=(h=="hide")?e:{height:e.height*d,width:e.width*d};c.from=f.from;c.percent=(h=="hide")?g:100;c.mode=h;f.effect("scale",c,b.duration,b.callback);f.dequeue()})};a.effects.scale=function(b){return this.queue(function(){var g=a(this);var d=a.extend(true,{},b.options);var j=a.effects.setMode(g,b.options.mode||"effect");var h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:(j=="hide"?0:100));var i=b.options.direction||"both";var c=b.options.origin;if(j!="effect"){d.origin=c||["middle","center"];d.restore=true}var f={height:g.height(),width:g.width()};g.from=b.options.from||(j=="show"?{height:0,width:0}:f);var e={y:i!="horizontal"?(h/100):1,x:i!="vertical"?(h/100):1};g.to={height:f.height*e.y,width:f.width*e.x};if(b.options.fade){if(j=="show"){g.from.opacity=0;g.to.opacity=1}if(j=="hide"){g.from.opacity=1;g.to.opacity=0}}d.from=g.from;d.to=g.to;d.mode=j;g.effect("size",d,b.duration,b.callback);g.dequeue()})};a.effects.size=function(b){return this.queue(function(){var c=a(this),n=["position","top","left","width","height","overflow","opacity"];var m=["position","top","left","overflow","opacity"];var j=["width","height","overflow"];var p=["fontSize"];var k=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"];var f=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"];var g=a.effects.setMode(c,b.options.mode||"effect");var i=b.options.restore||false;var e=b.options.scale||"both";var o=b.options.origin;var d={height:c.height(),width:c.width()};c.from=b.options.from||d;c.to=b.options.to||d;if(o){var h=a.effects.getBaseline(o,d);c.from.top=(d.height-c.from.height)*h.y;c.from.left=(d.width-c.from.width)*h.x;c.to.top=(d.height-c.to.height)*h.y;c.to.left=(d.width-c.to.width)*h.x}var l={from:{y:c.from.height/d.height,x:c.from.width/d.width},to:{y:c.to.height/d.height,x:c.to.width/d.width}};if(e=="box"||e=="both"){if(l.from.y!=l.to.y){n=n.concat(k);c.from=a.effects.setTransition(c,k,l.from.y,c.from);c.to=a.effects.setTransition(c,k,l.to.y,c.to)}if(l.from.x!=l.to.x){n=n.concat(f);c.from=a.effects.setTransition(c,f,l.from.x,c.from);c.to=a.effects.setTransition(c,f,l.to.x,c.to)}}if(e=="content"||e=="both"){if(l.from.y!=l.to.y){n=n.concat(p);c.from=a.effects.setTransition(c,p,l.from.y,c.from);c.to=a.effects.setTransition(c,p,l.to.y,c.to)}}a.effects.save(c,i?n:m);c.show();a.effects.createWrapper(c);c.css("overflow","hidden").css(c.from);if(e=="content"||e=="both"){k=k.concat(["marginTop","marginBottom"]).concat(p);f=f.concat(["marginLeft","marginRight"]);j=n.concat(k).concat(f);c.find("*[width]").each(function(){child=a(this);if(i){a.effects.save(child,j)}var q={height:child.height(),width:child.width()};child.from={height:q.height*l.from.y,width:q.width*l.from.x};child.to={height:q.height*l.to.y,width:q.width*l.to.x};if(l.from.y!=l.to.y){child.from=a.effects.setTransition(child,k,l.from.y,child.from);child.to=a.effects.setTransition(child,k,l.to.y,child.to)}if(l.from.x!=l.to.x){child.from=a.effects.setTransition(child,f,l.from.x,child.from);child.to=a.effects.setTransition(child,f,l.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){if(i){a.effects.restore(child,j)}})})}c.animate(c.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(g=="hide"){c.hide()}a.effects.restore(c,i?n:m);a.effects.removeWrapper(c);if(b.callback){b.callback.apply(this,arguments)}c.dequeue()}})})}})(jQuery);;/*
 * jQuery UI Effects Shake 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Shake
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.shake=function(b){return this.queue(function(){var e=a(this),l=["position","top","left"];var k=a.effects.setMode(e,b.options.mode||"effect");var n=b.options.direction||"left";var c=b.options.distance||20;var d=b.options.times||3;var g=b.duration||b.options.duration||140;a.effects.save(e,l);e.show();a.effects.createWrapper(e);var f=(n=="up"||n=="down")?"top":"left";var p=(n=="up"||n=="left")?"pos":"neg";var h={},o={},m={};h[f]=(p=="pos"?"-=":"+=")+c;o[f]=(p=="pos"?"+=":"-=")+c*2;m[f]=(p=="pos"?"-=":"+=")+c*2;e.animate(h,g,b.options.easing);for(var j=1;j<d;j++){e.animate(o,g,b.options.easing).animate(m,g,b.options.easing)}e.animate(o,g,b.options.easing).animate(h,g/2,b.options.easing,function(){a.effects.restore(e,l);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(this,arguments)}});e.queue("fx",function(){e.dequeue()});e.dequeue()})}})(jQuery);;/*
 * jQuery UI Effects Slide 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Slide
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.slide=function(b){return this.queue(function(){var e=a(this),d=["position","top","left"];var i=a.effects.setMode(e,b.options.mode||"show");var h=b.options.direction||"left";a.effects.save(e,d);e.show();a.effects.createWrapper(e).css({overflow:"hidden"});var f=(h=="up"||h=="down")?"top":"left";var c=(h=="up"||h=="left")?"pos":"neg";var j=b.options.distance||(f=="top"?e.outerHeight({margin:true}):e.outerWidth({margin:true}));if(i=="show"){e.css(f,c=="pos"?-j:j)}var g={};g[f]=(i=="show"?(c=="pos"?"+=":"-="):(c=="pos"?"-=":"+="))+j;e.animate(g,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(i=="hide"){e.hide()}a.effects.restore(e,d);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(this,arguments)}e.dequeue()}})})}})(jQuery);;/*
 * jQuery UI Effects Transfer 1.7.3
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Transfer
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.transfer=function(b){return this.queue(function(){var f=a(this),h=a(b.options.to),e=h.offset(),g={top:e.top,left:e.left,height:h.innerHeight(),width:h.innerWidth()},d=f.offset(),c=a('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(b.options.className).css({top:d.top,left:d.left,height:f.innerHeight(),width:f.innerWidth(),position:"absolute"}).animate(g,b.duration,b.options.easing,function(){c.remove();(b.callback&&b.callback.apply(f[0],arguments));f.dequeue()})})}})(jQuery);;
$(document).ready(function(){
    var index = 1;
    $("div.frmPage").each(function()
    { 
        $(this).append("<meta name='WT.si_x' content='"+index+"' />");
        index++;
        if(this.id.indexOf("1") > 0)
            $(this).show();
        else
            $(this).hide();       
    });
});

function frmNxtButtonClick(pagenumber)
{
    var tID = '#frmPage'+pagenumber;
    var tNxtID = '#frmPage' + (parseInt(pagenumber)+1);

    if(Validate(tID))
    {
        $(tID).hide();
        $(tNxtID).show();
    }
}

function frmPrvButtonClick(pagenumber)
{
    if(pagenumber != '1')
    {
        var tID = '#frmPage'+pagenumber;
        var tNxtID = '#frmPage' + (parseInt(pagenumber)-1);

        $(tID).hide();
        $(tNxtID).show();
    }
}

function ValidateForm()
{
    var formValid = true;
    $("div.frmPage").each(function()
    { 
      formValid = Validate("#"+this.id);
      if(!formValid)
        return formValid;   
    });
    return formValid;
}

function Validate(pageID)
{
    //LOCAL VARIABLE
    var pagevalid = true;
    
    //LOOP OVER FIELDS ON CURRENT PAGE
    $(pageID).find("div.frmFieldContainer").each(function()
    {  
        //LOCAL VARIABLES
        var fieldPopulated = true;
        var fieldValid = true;
      
        //IF FIELD IS TEXTBOX AND VALIDATE 
        if($(this).find("input[type=text]").length > 0)
        {
            //TEST FIELD MANDATORY
            if($(this).find(".frmFieldMandatoryText").length > 0)
            {
                fieldPopulated = ValidateTextBoxInputPopulated($(this).find("input[type=text]")[0]);
            }
            
            fieldValid = ValidateTextBoxInputValue($(this).find("input[type=text]")[0], $(this).find(".frmFieldRegEx").text());   
        }
        
        //IF FIELD IS RADIO COLLECTION AND VALIDATE
        else if($(this).find("input[type=radio]").length > 0)
        {
             //TEST FIELD MANDATORY
            if($(this).find(".frmFieldMandatoryText").length > 0)
            {
                fieldPopulated = ValidateRadioInputPopulated($(this).find("input[type=radio]"));  
            }
        }
        
        //IF FIELD IS DROPDOWNLIST AND VALIDATE
        else if($(this).find("select").length > 0)
        {       
            //TEST FIELD MANDATORY
            if($(this).find(".frmFieldMandatoryText").length > 0)
            {
                fieldPopulated = ValidateTextBoxInputPopulated($(this).find("select"));  
            }
        } 
        
        //IF FIELD IS CHECKBOX COLLECTION AND VALIDATE
        else if($(this).find("input[type=checkbox]").length > 0)
        {
            //TEST FIELD MANDATORY
            if($(this).find(".frmFieldMandatoryText").length > 0)
            {
                fieldPopulated = ValidateCheckBoxInputPopulated($(this).find("input[type=checkbox]"));  
            }
        }
                
        //CALL TO DISPLAY FORM VALIDATION
        DisplayFieldValidationMessages(this, fieldPopulated, fieldValid);
        
        //SET PAGE VALID FLAG
        if(fieldPopulated && fieldValid)
        {
         
        }
        else
        {
            pagevalid = false;
        }
    }); 

    return pagevalid;
}

function DisplayFieldValidationMessages(inputObj, pFieldPopulated, pFieldValid)
{
    var input = $(inputObj).find("input")[0];
   // alert('id: ' + $(input).attr('id') + ' Populated: ' + pFieldPopulated + ' Valid: ' + pFieldValid + ' Value: ' + $(input).val());
    if(pFieldPopulated)
    {
        $(inputObj).find(".frmFieldMandatoryText").hide();
        if(!pFieldValid)
        {
            //alert('in if');
            $(inputObj).find(".frmFieldValidationText").show();     
            $(inputObj).find(".frmFieldMandatoryText").hide();
        }
        else
        {
            $(inputObj).find(".frmFieldValidationText").hide();     
            $(inputObj).find(".frmFieldMandatoryText").hide();
        }
    }
    else
    {
        $(inputObj).find(".frmFieldMandatoryText").show();
        $(inputObj).find(".frmFieldValidationText").hide(); 
    }
}

function ValidateTextBoxInputPopulated(inputObj)
{
   return $(inputObj).val() != "";
}

function ValidateTextBoxInputValue(inputObj, regex)
{
    if($(inputObj).val() != "")
    {
        var re = new RegExp(regex);
        return re.test($(inputObj).val());
    }
    else
    {
        return true;
    }
}

function ValidateRadioInputPopulated(inputObj)
{
    return $(inputObj).is(":checked");
}

function ValidateCheckBoxInputPopulated(inputObj)
{
    return $(inputObj).is(":checked");    
}
//
// create closure
//
(function($) {
  //
  // plugin definition
  //
  $.fn.greyscale = function() {
	generate(this);
	//if (window.console) { console.log(rolloverColours); console.log(unselectedColours);}
	
	// iterate and reformat each matched element
	return this.each(function(i) {
	  $this = $(this);
	  $this.css("background-color", unselectedColours[i]);
	  $this.hover(function() {
		$(this).css("background-color", rolloverColours[i]);
	  }, function() {
		$(this).css("background-color", unselectedColours[i]);
	  });
	});
  };

  var unselectedColours = [];
  var rolloverColours = [];
  function generate($obj) 
  {
	var items = $obj.size(), increment = 16, color = 105; rollover = color + (increment * 2);
	for (var i = 0; i < items; ++i)
	{	   
		unselectedColours.push(RGB2Color(color,color,color));		
		rolloverColours.push(RGB2Color(rollover,rollover,rollover));
				
		rollover -= increment;
		color -= increment;
	}	
  };
  function RGB2Color(r,g,b) { return '#' + byte2Hex(r) + byte2Hex(g) + byte2Hex(b);}			  
  function byte2Hex(n) { var nybHexString = "0123456789ABCDEF"; return String(nybHexString.substr((n >> 4) & 0x0F,1)) + nybHexString.substr(n & 0x0F,1);}

//
// end of closure
//
})(jQuery);
var badBrowser = (/MSIE ((5\.5)|6)/.test(navigator.userAgent) && navigator.platform == "Win32");
var ie = (/MSIE ((5\.5)|6|7)/.test(navigator.userAgent) && navigator.platform == "Win32");
var opera = $.browser.opera;
var windowTitle = document.title;

function hideWindowedElements() {
    try {
        Lfl.onCentralFrameClose();
        Lfl.pauseSim(); //the above function will resume it even if QL didn't pause it
    }
    catch(err) { //alert('Unable to access the Lfl context, the onCentralFrameClose() function or the pauseSim() function');
    }
    finally {
        if (badBrowser) {
            $("#map2", top.document).css({margin:"0 0 0 -3000px"});    
        }
        else
        {   $("#map2", top.document).css({margin:"0 0 0 3000px"});    
        }
    }

    if (badBrowser) {
        $("select").css({visibility:"hidden"});
    }
}

function showWindowedElements() {
    $("#map2", top.document).css({margin:"0 0 0 0"});

    if (badBrowser) {
        $("select").css({visibility:"visible"});
    }
}

/*QuickLinks*/
function quicklinks_init()
{
        function showPage(pagenumber) {
        $('div#quicklinks div.links').each(
    
            function(index) {
                $(this).hide();                    
            });
                
            $('div#quicklinks div.links').eq(pagenumber-1).fadeIn();  
    
            if (currentPage == 1) {
                $("a#pagerNext").css("visibility", "visible");
                $("a#pagerPrevious").css("visibility", "hidden");
            }       
            else if (currentPage == maximumPages) {
                $("a#pagerNext").css("visibility", "hidden");
                $("a#pagerPrevious").css("visibility", "visible");
            }
            else {
                 $("a#pagerNext").css("visibility", "visible");
                 $("a#pagerPrevious").css("visibility", "visible");
            }
        }

    if ($('a.quicklinks').length)
    {
        //move the quick links div to below the button
        var iPos = $('a.quicklinks').position().top + $('a.quicklinks').height() + 10;
        $('div#quicklinks').css("top", iPos);
    
        var currentPage = 1;
        var maximumPages = $('div#quicklinks div.links').length;

        if (maximumPages > 1) {
            showPage(1); // init     
        }
        else {
            $("a#pagerPrevious").hide();
            $("a#pagerNext").hide();
        }
        
        $("a#pagerPrevious").click(function() {    
            currentPage--;
            if (currentPage >= 1)  { 
                showPage(currentPage);
            }
            else {
                currentPage = 1;
            }      
        });
    
        $("a#pagerNext").click(function() {    
            currentPage++;
            if (currentPage <= maximumPages)  { 
                showPage(currentPage);
            }
            else {
                currentPage = maximumPages;
            } 
        });
    
    
        $("li#quicklinkscontainer a.quicklinks").hover(
        function ()
        {			
	    hideWindowedElements();
			
		var height = $("div#header").height();

		$("div#quicklinks").css("border-bottom","11px solid #fff");
		$("div#header").height(height);
		$("div#quicklinks").show();
		$("div#quicklinks").animate({opacity: 1}, 0, 'swing');
		$("li#quicklinkscontainer").css("background-color","#5C5F62");
			
		$("div#quicklinks div.top").show();
		$("div#quicklinks div.bottom").show();
			
	                //first get height from css
 	                var iBottomHeight = $("div#quicklinks div.bottom").height();

                                //get the tallest bottom div
		var iTallest = $("div#quicklinks div.bottom div.left").height()
		if ($("div#quicklinks div.bottom div.right").height() > iTallest){
		    iTallest = $("div#quicklinks div.bottom div.right").height() 
		}

                            //get the headers height and add all margins
                            var iHeader = $("div#quicklinks div.bottom div.quicklinks-header").height() + 55;

                            //is bottom div taller than css declaration		
		var iBottomHeightCalc = iHeader + iTallest;
		if (iBottomHeightCalc > iBottomHeight){
		    iBottomHeight = iBottomHeightCalc 
		}

		//set height
		var qlheight = $("div#quicklinks div.top").height() + iBottomHeight;  	
		$("div#quicklinks").animate({height: qlheight}, 500, 'swing');
	
	            if(typeof(SWFReplace) == 'function') {   
			SWFReplace();        		
	            }

        },function(){}); 
           
        
        $("li#quicklinkscontainer").hoverIntent(
        function(){
                $("li#quicklinkscontainer a.quicklinks").css("padding-bottom","5px");
        },		
        function ()
        {          
            // Make sure that you updated thickbox.js if you edit this code. 
            // They both contain coding to hide the quick links 
            //Comment these lins to make quicklinks stay on (for testing)
		$("div#quicklinks div.top").hide();
		$("div#quicklinks div.bottom").hide();
		$("div#quicklinks").animate({height: 0}, 500, 'swing', function(){ showWindowedElements() });
		$("div#quicklinks").animate({opacity: 0}, 0, 'swing');
		$("div#quicklinks").css("border-bottom","none");
		$("li#quicklinkscontainer a.quicklinks").css("padding-bottom","0px");
		    
	    var height = $("div#header").height();
		$("div#header").height(height);

        });  
    }
}  /* end quicklinks_init()*/
 



/* MODEL LINKS JS */
//on page load (as soon as its ready) call JT_init
$(document).ready(JT_init);

function JT_init(){ 


    $("ul#modelmenu li.series")
    .mouseover(function(){$(this).css({"background-color":"#5C5F62"});})
    .mouseout(function(){$(this).css({"background-color":"transparent"}); })
    .hoverIntent(
    
        function()
        {           
            hideWindowedElements();
            $(this).css({"background-color":"#5C5F62"});
            JT_show(this, $(this).find(".model").attr("alt"),$(this).find(".model").get(0).id,$(this).find(".model").attr("alt"))
        },

        function()
        {           
            showWindowedElements();
            $(this).css({"background-color":"transparent"});
            $('#JT').remove()

            if (ie && document.title.indexOf("#") > -1 && location.href.indexOf("range") > -1) {
                document.title = windowTitle;
            }
        }
    )

$("ul#socialmenu li, ul#socialmenu li a, #sharelinks")
    .mouseover(function(){$("ul#socialmenu li").css({"background-color":"#5C5F62"});
    })
$("ul#socialmenu")
.mouseover(function(){$("ul#socialmenu li a").css({"padding-bottom":"12px"});

    })
    .mouseout(function(){$("ul#socialmenu li a").css({"padding-bottom":"4px"});
    })
        $("ul#socialmenu li, .share-images")
        .mouseout(function(){$("ul#socialmenu li").css({"background-color":"transparent"});
        })



    
    .hoverIntent(

        function()
        {           
            hideWindowedElements();
            $(this).css({"background-color":"#5C5F62"});
            JT_show(this, $(this).find(".social").attr("alt"),$(this).find(".social").get(0).id,$(this).find(".social").attr("alt"))
        },

        function()
        {           
            showWindowedElements();
            $('#JT').remove()
                                    
            if (ie && document.title.indexOf("#") > -1 && location.href.indexOf("range") > -1) {
                document.title = windowTitle;
            }
        }
    )
    

    if (ie) { $("ul#modelmenu li.series").css({"padding":"7px 0 0"}); }
    if (opera && $('body').css("direction") == "rtl") { $('body').css({"direction": "ltr"}); $('div#container').css({"direction": "rtl"}); }

    $("ul#modelmenu li.series .model").click(function () {return false;})

    if (opera && $('body').css("direction") == "rtl") { $('body').css({"direction": "ltr"}); $('div#container').css({"direction": "rtl"}); }
    $("ul#socialmenu li.follow .social").click(function () {return false;})
}

function JT_show(component, url,linkId,title)
{           
    if(title == false)title="&nbsp;";
    var de = document.documentElement;
    var w = self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
    var hasArea = w - getAbsoluteLeft(linkId);
    var clickElementy = getAbsoluteTop(linkId) -127; //set y position
    var queryString = url.replace(/^[^\?]+\??/,'');
    var params = parseQuery( queryString );

    //JPrimmer: No width is ever passed to the modellinks.ashx
    if(params['width'] === undefined){params['width'] = 250};
    if(params['link'] !== undefined)
    {           
        $('#' + linkId).bind('click',function(){window.location = params['link']});
        $('#' + linkId).css('cursor','pointer');
    }

    //JPrimmer: Removed the setting of the Left' and 'Width' style, we need to set this in the css instead (for RTL sites e.g. Israel)   
    if(hasArea>((params['width']*1)+75))
    {           
        $(component).append("<div id='JT'><div id='JT_copy'><div class='JT_loader'><div></div></div>");//right side
        $('#JT').css({top: clickElementy+"px"});
    }
    else
    {           
        $(component).append("<div id='JT'><div id='JT_arrow_right'></div><div id='JT_close_right'></div><div id='JT_copy'><div class='JT_loader'><div></div></div>");//left side
        var clickElementx = getAbsoluteLeft(linkId) -0;// - ((params['width']*1) + 15); //set x position
        $('#JT').css({left: clickElementx+"px", top: clickElementy+"px"});
    }
    if (badBrowser) {
        $('#JT_copy').load(url, null, 
        function() 
        {  //MS02: call the bound function call(s)
            $().trigger("trg_lxModelLinksLoaded");

            //$(component).css("background","#5C5F62 url()");
increaseJTMargin();

        });
    }
    else if (opera)
    {  var leftval = $('#JT').css("left");
        $('#JT').css({left:-5000});
        $('#JT_copy').load(url, null, 
                        
        function() 
        {  //MS02: call the bound function call(s)
            $().trigger("trg_lxModelLinksLoaded");
increaseJTMargin();

            var t;
            clearTimeout(t) 
            t = setTimeout(function() 
                                    {           
                                        $('#JT').css({left:leftval});
                                    }, 250);  
        });
    }
    else
    {           
        $('#JT_copy').load(url, null, 
        function() 
        {  //MS02: call the bound function call(s)
            $().trigger("trg_lxModelLinksLoaded");

            var t;
            clearTimeout(t); 
            var height = $('ul.model').height()+ 22;     
            var socialLinksHeight = $('#sharelinks').height();
            increaseJTMargin();

            //HIDE AND FADE TO ENABLE ANIMATION
            $('#modelmenuwrapper').hide();                            
            $('#modelmenuwrapper').fadeTo(1,0);                            
            $('#sharelinks').hide();                            
            $('#sharelinks').fadeTo(1,0); 
            $('div.models').hide();                                                     
            $('div.models').fadeTo(1,0);   
                                       
            //ANIMATE SLIDE
            $('#modelmenuwrapper').animate({ opacity: 1, height: height}, 300, 'swing');
            $('#sharelinks').animate({ opacity: 1, height: socialLinksHeight}, 300, 'swing');
            
            //FADE IN CONTENT
            t = setTimeout(function() 
                                    {           
                                        $('div.models').show();                                      
                                        $('div.models').fadeTo(300,1); 
                                                          
                                    }, 500);
        });
      
    }
   
}



function increaseJTMargin() {
            //PM - Added specifically for social links - we increase the size of the top margin for our links when there is a right hand side image present. 
            if ($('#sub-brand').length != 0) {
            
                var currentJTTop = 0;
                var linksHeight = 0;
                var linksMargin = 0;
                
                //code used for setting the 'top' attribute for the jt div on hover
  if ($('#sociallinkscontainer').length != 0) {

                currentJTTop = parseInt($('#sociallinkscontainer').position().top);
                linksHeight = parseInt($('#social').height()) + parseInt($('#social').css("paddingBottom"));
                linksMargin = parseInt($('#sharelinks').css("paddingTop"));                    
                ($('#sharelinks').css({top: (currentJTTop + linksMargin + linksHeight)}));
}
           }
}



function getElementWidth(objectId) {
	x = document.getElementById(objectId);
	return x.offsetWidth;
}

function getAbsoluteLeft(objectId) {
	// Get an object left position from the upper left viewport corner
	o = document.getElementById(objectId)
	oLeft = o.offsetLeft            // Get left position from the parent object
	while(o.offsetParent!=null) {   // Parse the parent hierarchy up to the document element
		oParent = o.offsetParent    // Get parent object reference
		oLeft += oParent.offsetLeft // Add parent left position
		o = oParent
	}
	return oLeft
}

function getAbsoluteTop(objectId) {
	// Get an object top position from the upper left viewport corner
	o = document.getElementById(objectId)
	oTop = o.offsetTop            // Get top position from the parent object
	while(o.offsetParent!=null) { // Parse the parent hierarchy up to the document element
		oParent = o.offsetParent  // Get parent object reference
		oTop += oParent.offsetTop // Add parent top position
		o = oParent
	}
	return oTop
}

function parseQuery ( query ) {
   var Params = new Object ();
   if ( ! query ) return Params; // return empty object
   var Pairs = query.split(/[;&]/);
   for ( var i = 0; i < Pairs.length; i++ ) {
      var KeyVal = Pairs[i].split('=');
      if ( ! KeyVal || KeyVal.length != 2 ) continue;
      var key = unescape( KeyVal[0] );
      var val = unescape( KeyVal[1] );
      val = val.replace(/\+/g, ' ');
      Params[key] = val;
   }
   return Params;
}

function blockEvents(evt) {
              if(evt.target){
              evt.preventDefault();
              }else{
              evt.returnValue = false;
              }
}

(function($) {
	$.fn.hoverIntent = function(f,g) {
		// default configuration options
		var cfg = {
			sensitivity: 225,
			interval: 100,
			timeout: 0
		};
		// override configuration options with user supplied object
		cfg = $.extend(cfg, g ? { over: f, out: g } : f );

		// instantiate variables
		// cX, cY = current X and Y position of mouse, updated by mousemove event
		// pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
		var cX, cY, pX, pY;

		// A private function for getting mouse position
		var track = function(ev) {
			cX = ev.pageX;
			cY = ev.pageY;
		};

		// A private function for comparing current and previous mouse position
		var compare = function(ev,ob) {
			ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
			// compare mouse positions to see if they've crossed the threshold
			if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
				$(ob).unbind("mousemove",track);
				// set hoverIntent state to true (so mouseOut can be called)
				ob.hoverIntent_s = 1;
				return cfg.over.apply(ob,[ev]);
			} else {
				// set previous coordinates for next time
				pX = cX; pY = cY;
				// use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
				ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
			}
		};

		// A private function for delaying the mouseOut function
		var delay = function(ev,ob) {
			ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
			ob.hoverIntent_s = 0;
			return cfg.out.apply(ob,[ev]);
		};

		// A private function for handling mouse 'hovering'
		var handleHover = function(e) {
			// next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut
			var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
			while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } }
			if ( p == this ) { return false; }

			// copy objects to be passed into t (required for event object to be passed in IE)
			var ev = jQuery.extend({},e);
			var ob = this;

			// cancel hoverIntent timer if it exists
			if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }

			// else e.type == "onmouseover"
			if (e.type == "mouseover") {
				// set "previous" X and Y position based on initial entry point
				pX = ev.pageX; pY = ev.pageY;
				// update "current" X and Y position based on mousemove
				$(ob).bind("mousemove",track);
				// start polling interval (self-calling timeout) to compare mouse coordinates over time
				if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}

			// else e.type == "onmouseout"
			} else {
				// unbind expensive mousemove event
				$(ob).unbind("mousemove",track);
				// if hoverIntent state is true, then call the mouseOut function after the specified delay
				if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
			}
		};

		// bind the function to the two event listeners
return this.mouseover(handleHover).mouseout(handleHover);
	};
})(jQuery);
// math3d.js
/*
Copyright 2008 Google Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

// Some Javascript math utilities.
//
// Exports V3 (3-vector utilities), M33 (3x3 matrix utilities)

// NOTE: This will be refactored in a more Object
// Oriented style, so don't get attached to this syntax!

// 3D vector functions.
V3 = {
  EARTH_RADIUS: 6378100,

  dup: function(a) {
    return [a[0], a[1], a[2]];
  },

  toString: function(a) {
    return "[" + a[0] + ", " + a[1] + ", " + a[2] + "]";
  },

  nearlyEqual: function(a, b, tolerance) {
    if (!tolerance) {
      tolerance = 1e-6;
    }
    return Math.abs(a[0] - b[0]) <= tolerance
      && Math.abs(a[1] - b[1]) <= tolerance
      && Math.abs(a[2] - b[2]) <= tolerance;
  },
  
  cross: function(a, b) {
    return [
        a[1] * b[2] - a[2] * b[1],
        a[2] * b[0] - a[0] * b[2],
        a[0] * b[1] - a[1] * b[0] ];
  },

  dot: function(a, b) {
    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
  },

  add: function(a, b) {
    return [
        a[0] + b[0],
        a[1] + b[1],
        a[2] + b[2]];
  },

  sub: function(a, b) {
    return [
        a[0] - b[0],
        a[1] - b[1],
        a[2] - b[2]];
  },

  scale: function(a, scale) {
    return [a[0] * scale, a[1] * scale, a[2] * scale];
  },

  length: function(a) {
    return Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]);
  },

  normalize: function(a) {
    var len = V3.length(a);
    if (len <= 0) {
      return [NaN, NaN, NaN];
    }
    return V3.scale(a, 1.0 / len);
  },

  bisect: function(a, b) {
    return [(a[0] + b[0]) / 2,
            (a[1] + b[1]) / 2,
            (a[2] + b[2]) / 2];
  },

  // Returns v rotated counterclockwise about axis by radians.
  // axis should be a unit vector; otherwise you'll get weird results.
  rotate: function(v, axis, radians) {
    var vDotAxis = V3.dot(v, axis);
    var vPerpAxis = V3.sub(v, V3.scale(axis, vDotAxis));
    var vPerpPerpAxis = V3.cross(axis, vPerpAxis);
    var result = V3.add(V3.scale(axis, vDotAxis),
                        V3.add(V3.scale(vPerpAxis, Math.cos(radians)),
                               V3.scale(vPerpPerpAxis, Math.sin(radians))));
    return result;
  },

  // Takes a set of Euler angles and converts from degrees to radians.
  toRadians: function(v) {
    return [v[0] * Math.PI / 180,
            v[1] * Math.PI / 180,
            v[2] * Math.PI / 180];
  },

  // Takes a set of Euler angles and converts from radians to degrees.
  toDegrees: function(v) {
    return [v[0] * 180 / Math.PI,
            v[1] * 180 / Math.PI,
            v[2] * 180 / Math.PI];
  },

  // Input is [lat, lon, alt].  Lat & lon are in degrees, positive up
  // and east.  Alt in meters, relative to Earth's radius.
  //
  // Output is meters x,y,z.  x points out of (0,0) (just off West
  // Africa), y points out the North Pole, and z points out of (0,-90)
  // (near Ecuador).
  latLonAltToCartesian: function(vert) {
    var sinTheta = Math.sin(vert[1] * Math.PI / 180);
    var cosTheta = Math.cos(vert[1] * Math.PI / 180);
    var sinPhi = Math.sin(vert[0] * Math.PI / 180);
    var cosPhi = Math.cos(vert[0] * Math.PI / 180);

    var r = V3.EARTH_RADIUS + vert[2];
    var result = [
        r * cosTheta * cosPhi,
        r * sinPhi,
        r * -sinTheta * cosPhi ];
    return result;
  },

  // Input is meters [x, y, z].  Output is [lat, lon, alt].  Lat & lon
  // in degrees, alt in meters.
  // 
  // V3.cartesianToLatLonAlt([R, 0, 0]) ~= [0, 0, 0]
  // V3.cartesianToLatLonAlt([R/sqrt(2), R/sqrt(2), 0]) ~= [45, 0, 0]
  // V3.cartesianToLatLonAlt([R/sqrt(2), 0, R/sqrt(2)]) ~= [0, -45, 0]
  cartesianToLatLonAlt: function(a) {
    var r = V3.length(a);
    if (r <= 0) {
      return [NaN, NaN, NaN];
    }
    var alt = r - V3.EARTH_RADIUS;
    // Compute projection onto unit sphere.
    var n = V3.scale(a, 1 / r);
    var lat = Math.asin(n[1]) * 180 / Math.PI;
    if (lat > 90) {
      lat -= 180;
    }
    var lon = 0;
    if (Math.abs(lat) < 90) {
      lon = Math.atan2(n[2], n[0]) * -180 / Math.PI;
    }
    return [lat, lon, alt];
  },

  // Return the signed perpendicular distance from the point c to the line
  // defined by [a, b].
  //
  // We get the sign by determining if point is to the left of the line,
  // from the point of view of looking towards the origin through vert0.
  // I.e. is it to the left, looking at the surface of the Earth from
  // above.
  leftDistance: function(a, b, c) {
    var ab = V3.sub(b, a);
    var ac = V3.sub(c, a);
    var cross = V3.cross(ab, ac);

    var dot = V3.dot(a, cross);
    var lineLength = V3.length(ab);
    if (lineLength < 1e-6) {
      return NaN;
    }
    var perpendicularDistance = V3.length(cross) / lineLength;

    if (dot > 0) {
      return perpendicularDistance;
    } else {
      return -perpendicularDistance;
    }
  },

  // Return the distance between two cartesian 3d points, along the
  // surface of the Earth, assuming they are on the surface of the
  // Earth.  (If the inputs are not on the surface of the earth, they
  // are projected to the surface first.)
  earthDistance: function(a, b) {
    var dot = V3.dot(V3.normalize(a), V3.normalize(b));
    var angle = Math.acos(dot);
    var dist = V3.EARTH_RADIUS * angle;
    return dist;
  }
};

M33 = {
  // Conventions:
  //
  // * V3 is a 3-element array representing a column vector
  //
  // * M33 is an array of 3 column vectors, representing a 3x3 matrix
  //
  //   [ [00] [10] [20] ]
  //   [ [01] [11] [21] ]
  //   [ [02] [12] [22] ]
  
  toString: function(a) {
    return "[" + V3.toString(a[0]) + ", " + 
      V3.toString(a[1]) + ", " + V3.toString(a[2]) + "]";
  },

  nearlyEqual: function(a, b) {
    return V3.nearlyEqual(a[0], b[0])
      && V3.nearlyEqual(a[1], b[1])
      && V3.nearlyEqual(a[2], b[2]);
  },

  transpose: function(a) {
    return [
        [a[0][0], a[1][0], a[2][0]],
        [a[0][1], a[1][1], a[2][1]],
        [a[0][2], a[1][2], a[2][2]]];
  },

  multiply: function(a, b) {
    var result = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];
    for (var i = 0; i < 3; i++) {
      for (var j = 0; j < 3; j++) {
        result[i][j] = a[0][j] * b[i][0]
                       + a[1][j] * b[i][1]
                       + a[2][j] * b[i][2];
      }
    }
    return result;
  },

  // Applies matrix a to column vector b.  (I.e. returns a * b)
  transform: function(a, b) {
    return [
        a[0][0] * b[0] + a[1][0] * b[1] + a[2][0] * b[2],
        a[0][1] * b[0] + a[1][1] * b[1] + a[2][1] * b[2],
        a[0][2] * b[0] + a[1][2] * b[1] + a[2][2] * b[2]];
  },

  // Applies the transpose of matrix a to column vector b.
  // (I.e. returns a.transpose() * b)
  transformByTranspose: function(a, b) {
    return [
        a[0][0] * b[0] + a[0][1] * b[1] + a[0][2] * b[2],
        a[1][0] * b[0] + a[1][1] * b[1] + a[1][2] * b[2],
        a[2][0] * b[0] + a[2][1] * b[1] + a[2][2] * b[2]];
  },

  identity: function() {
    return [[1, 0, 0], [0, 1, 0], [0, 0, 1]];
  },

  makeOrthonormalFrame: function(dir, up) {
    var newright = V3.normalize(V3.cross(dir, up));
    var newdir = V3.normalize(V3.cross(up, newright));
    var newup = V3.cross(newright, newdir);
    return [newright, newdir, newup];
  },

  // [heading, tilt, roll] (degrees) to [[right],[dir],[up]] (local
  // coords).  The return value transforms global direction vectors
  // into local direction vectors.  The transpose of the return value
  // transforms local direction vectors into global direction vectors.
  //
  // heading, tilt, roll are in degrees, clockwise about z,x,y axes (!?).
  // heading of 0 means pointing North
  // heading of 90 means pointing West
  //
  // [1, 0, 0] in local coords points right (East, for 0, 0, 0 htr)
  // [0, 1, 0] in local coords points ahead (North, for 0, 0, 0 htr)
  // [0, 0, 1] in local coords points up (away from center of earth)
  headingTiltRollToLocalOrientationMatrix: function(htr) {
    return M33.eulToMat(V3.toRadians(htr));
  },

  // [[right], [dir], [up]] (in local cartesian coords) to [heading, tilt, roll]
  // (in degrees)
  localOrientationMatrixToHeadingTiltRoll: function(mat) {
    var htr = M33.matToEul(mat);
    return V3.toDegrees(htr);
  },

  // Builds a local orientation matrix, to transform from local coords
  // into global coords.  "Local" means that the local x basis vector
  // points East, the y basis vector points North and the z basis
  // vector points Up (towards the sky).
  makeLocalToGlobalFrame: function(latLonAlt) {
    var vertical = V3.normalize(V3.latLonAltToCartesian(latLonAlt));
    var east = V3.normalize(V3.cross([0, 1, 0], vertical));
    var north = V3.normalize(V3.cross(vertical, east));

    return [east, north, vertical];
  },

  // See Graphics Gems IV, Chapter III.5, "Euler Angle Conversion" by
  // Ken Shoemake.
  //
  // http://vered.rose.utoronto.ca/people/spike/GEMS/GEMS.html
  eulerConfig: {
    i: 2, j: 0, k: 1,     // NOTE: KML convention is Z, X, Y!
    counterClockwise: true,
    sameAxis: false,      // third axis same as first (i == k)
    frameRelative: false  // frame-relative (vs. static)
  },

  // Construct matrix from Euler angles (in radians).
  //
  // Thanks to Ken Shoemake / Graphics Gems
  eulToMat: function(eulerAnglesIn) {
    var ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
    var config = M33.eulerConfig;
    var i = config.i;
    var j = config.j;
    var k = config.k;

    var ea = V3.dup(eulerAnglesIn);
    var m = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];
    if (config.frameRelative) { var t = ea[0]; ea[0] = ea[2]; ea[2] = t; }
    if (!config.counterClockwise) {
      ea[0] = -ea[0]; ea[1] = -ea[1]; ea[2] = -ea[2];
    }
    ti = ea[0];	  tj = ea[1];	th = ea[2];
    ci = Math.cos(ti); cj = Math.cos(tj); ch = Math.cos(th);
    si = Math.sin(ti); sj = Math.sin(tj); sh = Math.sin(th);
    cc = ci*ch; cs = ci*sh; sc = si*ch; ss = si*sh;
    if (config.sameAxis) {
      m[i][i] = cj;     m[i][j] =  sj*si;    m[i][k] =  sj*ci;
      m[j][i] = sj*sh;  m[j][j] = -cj*ss+cc; m[j][k] = -cj*cs-sc;
      m[k][i] = -sj*ch; m[k][j] =  cj*sc+cs; m[k][k] =  cj*cc-ss;
    } else {
      m[i][i] = cj*ch; m[i][j] = sj*sc-cs; m[i][k] = sj*cc+ss;
      m[j][i] = cj*sh; m[j][j] = sj*ss+cc; m[j][k] = sj*cs-sc;
      m[k][i] = -sj;   m[k][j] = cj*si;    m[k][k] = cj*ci;
    }
    return m;
  },

  // Convert matrix to Euler angles (in radians).
  //
  // Thanks to Ken Shoemake / Graphics Gems
  matToEul: function(m, config) {
    var config = M33.eulerConfig;
    var i = config.i;
    var j = config.j;
    var k = config.k;

    var FLT_EPSILON = 1e-6;
    var ea = [0, 0, 0];
    if (config.sameAxis) {
      var sy = Math.sqrt(m[i][j] * m[i][j] + m[i][k] * m[i][k]);
      if (sy > 16 * FLT_EPSILON) {
        ea[0]= Math.atan2(m[i][j], m[i][k]);
        ea[1]= Math.atan2(sy, m[i][i]);
        ea[2]= Math.atan2(m[j][i], -m[k][i]);
      } else {
        ea[0]= Math.atan2(-m[j][k], m[j][j]);
        ea[1]= Math.atan2(sy, m[i][i]);
        ea[2]= 0;
      }
    } else {
      var cy = Math.sqrt(m[i][i] * m[i][i] + m[j][i] * m[j][i]);
      if (cy > 16 * FLT_EPSILON) {
        ea[0]= Math.atan2(m[k][j], m[k][k]);
        ea[1]= Math.atan2(-m[k][i], cy);
        ea[2]= Math.atan2(m[j][i], m[i][i]);
      } else {
        ea[0]= Math.atan2(-m[j][k], m[j][j]);
        ea[1]= Math.atan2(-m[k][i], cy);
        ea[2]= 0;
      }
    }
    if (!config.counterClockwise) {
      ea[0] = -ea[0]; ea[1] = -ea[1]; ea[2] = -ea[2];
    }
    if (config.frameRelative) { var t = ea[0]; ea[0] = ea[2]; ea[2] = t; }
    return ea;
  }
};
// geplugin-helpers.js
// requires math3d.js

/*
Copyright 2008 Google Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

/**
 * @fileoverview This file provides a very basic Google Earth plugin helpers
 * library called GEHelpers
 * @author Roman Nurik
 * @supported Tested in IE6+ and FF2+
 */

/**
 * Preliminary/very basic Google Earth plugin helpers library
 * @param {GEPlugin} ge Google Earth instance
 * @constructor
 */
function GEHelpers(ge) {
  this.ge = ge;
}

/**
 * Creates a point placemark at the given location
 * @param {google.maps.LatLng} loc Location of the point placemark
 * @param {Object?} opt_opts Options object, with the following fields:
 *   {string} id The placemark ID in the Earth object model
 *   {string} name The placemark name
 *   {string} description The placemark description
 *   {string} standardIcon The name of a standard KML icon (i.e. 'red-circle')
 *   {string} icon The URL of the placemark's icon
 * @return {KmlPlacemark} The created placemark
 */
GEHelpers.prototype.createPointPlacemark = function(loc, opt_opts) {
  var placemark = this.ge.createPlacemark(opt_opts.id ? opt_opts.id : '');
  
  if (opt_opts.name)
    placemark.setName(opt_opts.name);
  
  //if (opt_opts.description)
    //placemark.setDescription(opt_opts.description);
    
  if (opt_opts.icon) {
   	var icon = this.ge.createIcon('');
    icon.setHref(opt_opts.icon);
	
	 
    var iconStyle = this.ge.createStyle('');
    iconStyle.getIconStyle().setIcon(icon);
    
    var styleMap = this.ge.createStyleMap('');
    styleMap.setNormalStyle(iconStyle);
    styleMap.setHighlightStyle(iconStyle);
    placemark.setStyleSelector(styleMap);
  }
  
  var point = this.ge.createPoint('');
  point.setLatitude(loc.lat());
  point.setLongitude(loc.lng());
  placemark.setGeometry(point);
  
  this.ge.getFeatures().appendChild(placemark);
  return placemark;
}

/**
 * Clears all features in the plugin object model
 */
GEHelpers.prototype.clearFeatures = function() {
  var features = this.ge.getFeatures();
  var c;
  while (c = features.getLastChild())
    features.removeChild(c);
}

/**
 * Removes the feature with the given ID from the plugin object model
 * @param {string} id The ID of the feature to remove
 */
GEHelpers.prototype.removeFeature = function(id) {
  var features = this.ge.getFeatures();
  var c = features.getFirstChild();
  while (c) {
    if (c.getId() == id) {
      features.removeChild(c);
      break;
    }
    
    c = c.getNextSibling();
  }
}

/**
 * Creates a KmlStyle containing a line style with the given options
 * @param {Object?} opt_opts LineStyle parameters described by the fields:
 *   {number} width The line width
 *   {color} color The line color in KML's 'aabbggrr' format
 * @return {KmlStyle} The created KmlStyle with the given line style parameters
 */
GEHelpers.prototype.createLineStyle = function(opt_opts) {
  var style = this.ge.createStyle('');
  var lineStyle = style.getLineStyle();
  if (opt_opts.width)
    lineStyle.setWidth(opt_opts.width);
  if (opt_opts.color)
    lineStyle.getColor().set(opt_opts.color);
  return style;
}

/**
 * Calculates the heading/bearing between two locations. Taken from the formula
 * provided at http://mathforum.org/library/drmath/view/55417.html
 * @param {google.maps.LatLng} loc1 The start location
 * @param {google.maps.LatLng} loc2 The destination location
 * @return {number} The heading from loc1 to loc2, in degrees
 */
GEHelpers.prototype.getHeading = function(loc1, loc2) {
  lat1 = this.deg2rad(loc1.lat());
  lon1 = this.deg2rad(loc1.lng());
  
  lat2 = this.deg2rad(loc2.lat());
  lon2 = this.deg2rad(loc2.lng());
  
  var heading = this.fixAngle(this.rad2deg(Math.atan2(
    Math.sin(lon2 - lon1) * Math.cos(lat2),
    Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) *
      Math.cos(lon2 - lon1))));
  
  return heading;
}

/**
 * Converts radians to degrees
 * @param {number} r Radians
 * @return {number} Degrees
 */
GEHelpers.prototype.rad2deg = function(r) {
  return r * 180.0 / Math.PI;
}

/**
 * Converts degrees to radians
 * @param {number} d Degrees
 * @return {number} Radians
 */
GEHelpers.prototype.deg2rad = function(d) {
  return d * Math.PI / 180.0;
}

// Keep an angle in [-180,180]
/**
 * Keep an angle in the [-180, 180] range
 * @param {number} a Angle in degrees
 * @return {number} The angle in the [-180, 180] degree range
 */
GEHelpers.prototype.fixAngle = function(a) {
  while (a < -180)
    a += 360;
  
  while (a > 180)
    a -= 360;
  
  return a;
}

/**
 * Calculates an intermediate lat/lon, (100 * f)% between loc1 and loc2
 * @param {google.maps.LatLng} loc1 The start location
 * @param {google.maps.LatLng} loc2 The end location
 * @return {google.maps.LatLng} An intermediate location between loc1 and loc2
 */
GEHelpers.prototype.interpolateLoc = function(loc1, loc2, f) {
  return new GLatLng(
    loc1.lat() + f * (loc2.lat() - loc1.lat()),
    loc1.lng() + f * (loc2.lng() - loc1.lng()));
}

/**
 * Gets the earth distance between two locations, factoring in ground altitudes
 * provided by the associated Google Earth plugin instance
 * @param {google.maps.LatLng} loc1 The first location
 * @param {google.maps.LatLng} loc2 The second location
 * @return {number} The distance from loc1 to loc2, in meters
 */
GEHelpers.prototype.distance = function(loc1, loc2) {
  p1 = V3.latLonAltToCartesian([loc1.lat(), loc1.lng(),
    this.ge.getGlobe().getGroundAltitude(loc1.lat(), loc1.lng())]);
  p2 = V3.latLonAltToCartesian([loc2.lat(), loc2.lng(),
    this.ge.getGlobe().getGroundAltitude(loc2.lat(), loc2.lng())]);
  return V3.earthDistance(p1, p2);
}
/*
 * jQuery selectbox plugin
 *
 * Copyright (c) 2007 Sadri Sahraoui (brainfault.com)
 * Licensed under the GPL license and MIT:
 *   http://www.opensource.org/licenses/GPL-license.php
 *   http://www.opensource.org/licenses/mit-license.php
 *
 * The code is inspired from Autocomplete plugin (http://www.dyve.net/jquery/?autocomplete)
 *
 * Revision: $Id$
 * Version: 0.5
 * 
 * Changelog :
 *  Version 0.6
 *  - added width option    @Ross Tyler
 *  - added Change() call to fire onchange event    @Ross Tyler
 *  - wrapped all elements in container div to fix ie6 display issues   @Ross Tyler
 *  - toggle visibility when clicking arrow
 *  Version 0.5 
 *  - separate css style for current selected element and hover element which solve the highlight issue 
 *  Version 0.4
 *  - Fix width when the select is in a hidden div   @Pawel Maziarz
 *  - Add a unique id for generated li to avoid conflict with other selects and empty values @Pawel Maziarz
 *
 *  - Amended by Ross Tyler to support optional postback and ability to set width
 */
jQuery.fn.extend({
	selectbox: function(options) {
		return this.each(function() {
			new jQuery.SelectBox(this, options);
		});
	}
});


/* pawel maziarz: work around for ie logging */
if (!window.console) {
	var console = {
		log: function(msg) { 
	 }
	}
}
/* */

jQuery.SelectBox = function(selectobj, options) {

    var opt = options || {};
    opt.inputClass = opt.inputClass || "selectbox";
    opt.containerClass = opt.containerClass || "selectbox-wrapper";
    opt.hoverClass = opt.hoverClass || "current";
    opt.currentClass = opt.selectedClass || "selected";
    opt.debug = opt.debug || false;
    opt.postBack = opt.postBack || false;
    opt.width = opt.width || undefined;

    var elm_id = selectobj.id;
    var active = -1;
    var inFocus = false;
    var hasfocus = 0;
    //jquery object for select element
    var $select = $(selectobj);
    // jquery container object
    var $container = setupContainer(opt);
    //jquery input object 
    var $input = setupInput(opt);
    // hide select and append newly created elements
    $select.wrap("<div/>").hide().before($input).before($container);

    init();

    $input.toggle(function() {
        inFocus = true;
        $container.show();
    }, function() {
        inFocus = false;
        $container.hide();
    })
	.keydown(function(event) {
	    switch (event.keyCode) {
	        case 38: // up
	            event.preventDefault();
	            moveSelect(-1);
	            break;
	        case 40: // down
	            event.preventDefault();
	            moveSelect(1);
	            break;
	        //case 9:  // tab   
	        case 13: // return
	            event.preventDefault(); // seems not working in mac !
	            $('li.' + opt.hoverClass).trigger('click');
	            break;
	        case 27: //escape
	            hideMe();
	            break;
	    }
	})
	.blur(function() {
	    if ($container.is(':visible') && hasfocus > 0) {
	        if (opt.debug) console.log('container visible and has focus')
	    } else {
	        hideMe();
	    }
	});


    function hideMe() {
        hasfocus = 0;
        $container.hide();
    }

    function init() {
        $container.append(getSelectOptions($input.attr('id'))).hide();
        if (opt.width != undefined) {
            $input.width(opt.width);
            $container.width(opt.width);
        }
        else {
            var width = $select.width() + 26; //compensate for background button size
            $input.width(width);
            $container.width(width);
        }
    }

    function setupContainer(options) {
        var container = document.createElement("div");
        $container = $(container);
        $container.attr('id', elm_id + '_container');
        $container.addClass(options.containerClass);

        return $container;
    }

    function setupInput(options) {
        var input = document.createElement("input");
        var $input = $(input);
        //
        //$input
        //
        $input.attr("id", elm_id + "_input");
        $input.attr("type", "text");
        $input.addClass(options.inputClass);
        $input.attr("autocomplete", "off");
        $input.attr("readonly", "readonly");
        $input.attr("tabIndex", $select.attr("tabindex")); // "I" capital is important for ie

        return $input;
    }

    function moveSelect(step) {
        var lis = $("li", $container);
        if (!lis) return;

        active += step;

        if (active < 0) {
            active = 0;
        } else if (active >= lis.size()) {
            active = lis.size() - 1;
        }

        lis.removeClass(opt.hoverClass);

        $(lis[active]).addClass(opt.hoverClass);
    }

    function setCurrent() {
        var li = $("li." + opt.currentClass, $container).get(0);
        var el = li.id.substring(li.id.indexOf("_input_") + 7, li.id.length);
        $select.val(el);
        $input.val($(li).text());
        $select.change();

        if (opt.postBack)
            document.forms[0].submit();
        return true;
    }

    // select value
    function getCurrentSelected() {
        return $select.val();
    }

    // input value
    function getCurrentValue() {
        return $input.val();
    }

    function getSelectOptions(parentid) {
        var select_options = new Array();
        var ul = document.createElement('ul');
        $select.children('option').each(function() {
            var li = document.createElement('li');
            li.setAttribute('id', parentid + '_' + $(this).val());
            li.innerHTML = $(this).text();
            if ($(this).is(':selected')) {
                $input.val($(this).text());
                $(li).addClass(opt.currentClass);
            }
            ul.appendChild(li);
            if ($(this).is(':disabled')) {
                $(li).addClass('disabled');
            }
            else {
                $(li)
			.mouseover(function(event) {
			    hasfocus = 1;
			    if (opt.debug) console.log('over on : ' + this.id);
			    jQuery(event.target, $container).addClass(opt.hoverClass);
			})
			.mouseout(function(event) {
			    hasfocus = -1;
			    if (opt.debug) console.log('out on : ' + this.id);
			    jQuery(event.target, $container).removeClass(opt.hoverClass);
			})
			.click(function(event) {
			    var fl = $('li.' + opt.hoverClass, $container).get(0);
			    if (opt.debug) console.log('click on :' + this.id);
			    $('li.' + opt.currentClass).removeClass(opt.currentClass);
			    $(this).addClass(opt.currentClass);
			    setCurrent();
			    hideMe();
			});
            }
        });
        return ul;
    }
};
// simulator.js
// requires geplugin-helpers.js

/*
Copyright 2008 Google Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

/**
 * The amount of real time to simulate per simulator tick
 * @type {number}
 */
DDSimulator.TICK_SIM_MS = 66;

/**
 * Total real time elapsed in the simulation, in seconds
 * @type {number}
 */
DDSimulator.prototype.totalTime = 0;

/**
 * Total distance traveled in the simulation, in meters
 * @type {number}
 */
DDSimulator.prototype.totalDistance = 0;

/**
 * Current traveling speed in the simulation, in meters per second
 * @type {number}
 */
DDSimulator.prototype.currentSpeed = 0;

DDSimulator.prototype.currentLoc = null;

DDSimulator.prototype.currentHeading = 0;

DDSimulator.prototype.running = false;
DDSimulator.prototype.paused  = false;


/**
 * Constructs a simulator object
 * @param {Object} ge The Google Earth instance
 * @param {Array.<Object>} path The path to simulate, as an array of vertex
 *     objects of the form:
 *   {google.maps.LatLng} loc The vertex location of vertex,
 *   {number} step The index of the associated directions step
 *   {number} duration The time duration before the next vertex, in seconds
 *   {number} distance The distance to the next vertex, in meters
 * @param {Object?} opt_opts An object with the following optional fields:
 *   {Function?} on_tick A callback function, called after one tick of the
 *       simulation completes
 *   {Function?} on_changeStep A callback function for when the current step
 *       changes (as per the step property of path items)
 *   {number} speed A multiplier on the simulation speed
 * @constructor
 */
function DDSimulator(path, opt_opts) {
	this.path = path;
	this.options = opt_opts || {};
	if (!this.options.speed)
		this.options.speed = 1.0;
 
 	var me = this;
	me.reset();
 	this.tickListener = function() {
      	if (me.running&&!me.paused) me.tick();
  	};
}

DDSimulator.prototype.reset = function(){
	this.currentLoc = this.path[0].loc;
    this.totalTime = 0;
	this.totalDistance = 0;
	this.currentSpeed = 0;
	this.oldFlyToSpeed = 0;
	this.currentHeading = getHeading(this.path[0].loc, this.path[1].loc);
 	this.running = false;
	this.paused = false;
 	this.pathIndex_ = 0;
 	this.currentStep_ = -1;
 	this.segmentTime_ = 0;
	this.segmentDistance_ = 0;
}

DDSimulator.prototype.start = function(){
	this.running = true;
	this.paused = false;
	this.tick();
}

DDSimulator.prototype.stop = function(){
	this.running = false;
	this.paused = false;
}

DDSimulator.prototype.pause = function(){
	this.paused = true;
}

DDSimulator.prototype.tick = function(){
	if (this.pathIndex_ >= this.path.length - 1) {
		this.running = false;
		if (this.options.on_finish) 
			this.options.on_finish();
		return;
	}
	// update current route step and run callback
	if (this.path[this.pathIndex_].step != this.currentStep_) {
		this.currentStep_ = this.path[this.pathIndex_].step;
		if (this.options.on_changeStep) 
			this.options.on_changeStep(this.currentStep_);
	}
	
	// move up TICK_SIM_MS milliseconds
	this.totalTime += DDSimulator.TICK_SIM_MS * this.options.speed / 1000.0;
	this.segmentTime_ += DDSimulator.TICK_SIM_MS * this.options.speed / 1000.0;
	
	var segmentDuration = this.path[this.pathIndex_].duration;
	
	if (!this.beforeSegmentDistance_) 
		this.beforeSegmentDistance_ = 0.0;
	
	// move to next segment if we pass it in this tick
	while (this.pathIndex_ < this.path.length - 1 && this.segmentTime_ >= segmentDuration) {
		this.segmentTime_ -= segmentDuration;
		
		// adjust distances
		this.beforeSegmentDistance_ += this.path[this.pathIndex_].distance;
		this.segmentDistance_ = 0;
		
		// update new position in path array
		this.pathIndex_++;
		
		// bugfix thanks to naeeem, markw65:
		segmentDuration = this.path[this.pathIndex_].duration;
	}
	
	// bugfix thanks to markw65
	if (segmentDuration) {
		this.segmentDistance_ = this.path[this.pathIndex_].distance *
		Math.min(1.0, this.segmentTime_ / segmentDuration);
		this.currentSpeed = this.path[this.pathIndex_].distance / segmentDuration;
	}
	else {
		this.segmentDistance_ = 0.0;
		this.currentSpeed = 0.0;
	}
	
	this.totalDistance = this.beforeSegmentDistance_ + this.segmentDistance_;
	
	if (this.pathIndex_ >= this.path.length - 1) {
		this.running = false;
		if (this.options.on_finish) 
			this.options.on_finish();
		return;
	}
	//Skip water etc
	var didSkip = false;
	if (this.path[this.pathIndex_].skip && this.options.on_skip) {
		this.options.on_skip();
		didSkip = true;
	}
	while (this.path[this.pathIndex_].skip) {
		this.pathIndex_++;
		this.totalDistance += this.path[this.pathIndex_].distance;
		this.totalTime += this.path[this.pathIndex_].duration;
	}
	//if (didSkip&&!onSkipResult) return
	if (didSkip&&this.options.after_skip) {
		if (!this.options.after_skip()) return
	}
			
	//if (didSkip&&!onSkipResult) return
  // update the current location
  this.currentLoc = interpolateLoc(
      this.path[this.pathIndex_].loc,
      this.path[this.pathIndex_ + 1].loc,
      this.segmentTime_ / this.path[this.pathIndex_].duration);
	  
  this.currentHeading = getHeading(this.path[this.pathIndex_].loc, this.path[this.pathIndex_ + 1].loc)
  
  // fire the callback if one is provided
  if (this.options.on_tick)
    this.options.on_tick();
}

function interpolateLoc(loc1, loc2, f) {
  return new GLatLng(
    loc1.lat() + f * (loc2.lat() - loc1.lat()),
    loc1.lng() + f * (loc2.lng() - loc1.lng()));
}

function getHeading(loc1, loc2) {
  lat1 = deg2rad(loc1.lat());
  lon1 = deg2rad(loc1.lng());
  
  lat2 = deg2rad(loc2.lat());
  lon2 = deg2rad(loc2.lng());
  
  var heading = fixAngle(rad2deg(Math.atan2(
    Math.sin(lon2 - lon1) * Math.cos(lat2),
    Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) *
      Math.cos(lon2 - lon1))));
  
  return heading;
}

function rad2deg(r) {
  return r * 180.0 / Math.PI;
}

function deg2rad(d) {
  return d * Math.PI / 180.0;
}

function fixAngle(a) {
  while (a < -180)
    a += 360;
  
  while (a > 180)
    a -= 360;
  
  return a;
}
/*!
 * Blast Radius General UI Library
 * 
 * Date: 		$LastChangedDate: 2009-06-19 10:27:30 +0100 (Fri, 19 Jun 2009) $
 * Revision:	$Revision: 789 $
 */
brUI = (function($) {

	var ZoomControl = null // ZoomControl 'class'
	var LinkControl = null // LinkControl 'class'
	
	/** 
	Creates dropdown component.
	
	Markup:
	<div id="myDropDown" class="br-dropdown">
		<div class="br-dropdown-prompt"><span>Prompt...</span></div>
		<div class="br-dropdown-options">
			<div>Option 1</div>
			<div>Option 2</div>
		</div>
	</div> 
	
	params:
	$holder - jQuery element 
	prompt  - text to show when no option is selected. if null the 1st option gets selected by default.
	options - array of options. Each object must have 'display' property
	onchange - function(selectedOption). 
	settings - {menuMode: Boolean; dropUp: Boolean}
	*/
	var makeDropDown = function($holder, prompt, options, onchange, settings) {
		var settings = settings || {}
		var options = options || {}
		// state
		var _selected = null
		var init = function(attribute) {
    		//generate markup
    		$holder.addClass("br-dropdown")
    		var html = '<div class="br-dropdown-prompt"><span>' + prompt + '</span></div>\n' +
    					'<div class="br-dropdown-options">\n'
    		for (var i=0; i < options.length; i++) {
    			var opt = options[i]
    			html += '<div>' + opt.display + '</div>\n'
    		};
    		html += '</div>\n'				
    		$holder.html(html)
    				
    		var $options = $holder.find(".br-dropdown-options"),
    		    $prompt  = $holder.find(".br-dropdown-prompt")
    		
    		$holder.click(function(event) {
				event.preventDefault();
				$options.toggle()
				//$('.br-dropdown-options',$(this)).toggle()
    			if (settings.dropUp) {
        		    $options.css('top', -($options.height() + 2) + 'px') // has to be called when $options is visible. otherwise $options.height() is 0. //ms: updated as ie6 works different with relative and absolute etc.
        		} else if (settings.top) {
					$options.css('top', settings.top);
				}    		    
    		})

    		$options.find("div").each(function(i) {
    			$(this).click(function(event) {
					event.preventDefault();
					$('div:parent',$(this)).hide()
    				//$options.hide()
        			var option = options[i]    				
				    if (option !== _selected) { // selection changed
    				    if (onchange) {
        					onchange(option)
        				}
        				if (! settings.menuMode) { // in menu mode don't keep selection.
        				    select(option)
        				}
			        }
    			})
    		})
    		
    		//default selection
    		if (!prompt) {
    		    select(options[0])
    		}
		}
	
		var select = function(option) {
		    _selected = option
	        $holder.find(".br-dropdown-prompt span").text(option ? option.display : prompt) //TODO check that option is in the options array?  
		}

		var selected = function() {
		    return _selected
		}
		
		init() // call constructor
		
		// return dropdown object with public members
		return {
		    select:   select,
		    selected: selected
		}
	}

    /** 
    google - requires google maps api
    id     - id for generated div
    */
    var makeZoomControl = function(google, id) {
        if (!ZoomControl) {
            _initZoomControl(google)
        }
        return new ZoomControl(id)
    }

    var _initZoomControl = function(google) {
        ZoomControl = function(id) {
            this._id = id
        }
        ZoomControl.prototype = new google.maps.Control() // inherit GControl
        
        $.extend( ZoomControl.prototype, {

            initialize: function(map) {

                var $control = $(document.createElement('div'))
                                    .attr('id', this._id)
                                    .addClass('fl-zoomcontrol')
                                    .html('<table><tr>' +
                                        '<td><a href="#" class="fl-zoomcontrol-minus">MINUS</a></td>' + 
                                        '<td><div class="fl-zoomcontrol-slider "></div></td>' + 
                                        '<td><a href="#" class="fl-zoomcontrol-plus">PLUS</a></td>' +
                                        '</tr></table>')
                var $slider = $control.find(".fl-zoomcontrol-slider")
                $slider.slider({
                    orientation: 'horizontal',
                    min: 0,
                    max: 17, //maximum zoom level for google maps
                    value: map.getZoom(),
                    change: function(event, ui) {
                        map.setZoom(ui.value)
                    }                
                })
                // cannot use ".fl-zoomcontrol-minus, .fl-zoomcontrol-plus" here - breaks on Safari.
                $control.find(".fl-zoomcontrol-minus").click(function(event) {
                    event.preventDefault()
                    map.zoomOut()
                })
                $control.find(".fl-zoomcontrol-plus").click(function(event) {
                    event.preventDefault()
                    map.zoomIn()
                })                
                google.maps.Event.addListener(map, "zoomend", function(oldLevel, newLevel) {
                    $slider.slider('option', 'value', newLevel)
                });

                var control = $control.get(0)
                map.getContainer().appendChild( control );
                return control;
            },

            getDefaultPosition: function() {
                return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(3, 0));
            }
        });
    }

    /** 
    google - requires google maps api
    id - id for generated dom element
    links : [{id: 'link1', label: 'Click me', callback?: fn}] - array of links
    */
    var makeLinkControl = function(google, id, links, mediaBase) {
        if (!LinkControl) {
            _initLinkControl(google)
        }
        return new LinkControl(id, links, mediaBase)
    }

    var _initLinkControl = function(google) {
        LinkControl = function(id, links, mediaBase) {
            this._id    = id
            this._links = links
			this._mediaBase = mediaBase
        }
        LinkControl.prototype = new google.maps.Control() // inherit GControl
        $.extend( LinkControl.prototype, {

            initialize: function(map) {
                var $control = $(document.createElement('div'))
                                    .attr('id', this._id)
                                    .addClass('fl-linkcontrol')
                var linksMarkup = '<table><tr>'
                for (var i=0; i < this._links.length; i++) {
                    var link = this._links[i]
                    linksMarkup += 
                        '<td>' +
                            '<table class="fl-linkcontrol-item" id="' + link.id + '"><tr>' +
                                '<td><div class="fl-linkcontrol-icon"><img src="'+this._mediaBase + link.image + '"/></div></td>' + 
                                '<td><a href="#" class="fl-linkcontrol-link">' + link.label + '</a></td>' + 
                            '</tr></table>' +
                        '</td>';
                };
                linksMarkup += '</tr></table>'
                $control.html(linksMarkup)
                
                var me = this
                $control.click(function(event) {
                    var $target = $(event.target)
                    if ($target.hasClass('fl-linkcontrol-link')) { // anchor was clicked
                        event.preventDefault()
                        var linkId = $target.parents('.fl-linkcontrol-item').attr('id')
                        for (var i=0; i < me._links.length; i++) { // find link by id
                            var link = me._links[i]
                            if (link.id.toString() === linkId) { // found
                                if (link.callback) {
                                    link.callback(link)
                                }
                                break;
                            }
                        };
                    }
                })
                
                var control = $control.get(0)
                map.getContainer().appendChild( control );
                return control;
            },

            getDefaultPosition: function() {
                return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(3, 0));
            }
        });
    }
    
    function initDefaultText ($input) {
        var $selection = $input || $('.default-text')
        $selection
            .focus(function(event) {
                $this = $(this)
                if ($this.is('.default-text-active')) {
                    $this.removeClass('default-text-active')
                    $this.addClass('default-text-entry')
                    $this.val('')
                }
            })
            .blur(function(event) {
                $this = $(this)
                if ($this.val() === '') {
					$this.removeClass('default-text-entry')
                    $this.addClass('default-text-active')
                    $this.val( this.title )
                }
            })
            .blur() // initially set default-text-active
    }

    function clearDefaultText () {
        $('.default-text-active').val('').removeClass('default-text-active')
    }
    
    $(document).ready(function() {
        // initialize dropdown
        $(document).mousedown(function(event) {
            var $target = $(event.target)
            if (($target.parents('.br-dropdown')).find('.br-dropdown-options').is(':visible')) {
                // clicked on the prompt of already opened dropdown - do nothing
                return
            }
            if ($target.parents(".br-dropdown-options").length === 0) { //click outside dropdown
                $(".br-dropdown-options").hide()
            }
        })        
    })
	
	// export public members
	return {
		makeDropDown    : makeDropDown,
		makeZoomControl : makeZoomControl,
		makeLinkControl : makeLinkControl,
		initDefaultText : initDefaultText,
		clearDefaultText: clearDefaultText
	}
})(jQuery)
function fiJavascriptReady()
{	pageready = 1;
	return true;
}

function fiFlashReady()
{ // tells js flash is ready
}


// Standard interface for Flash calls on JavaScript    
function fiPageComm(jObj) {
	switch(jObj.type)
	{	case "redirect":
			fi.redirect(jObj);break;

		case "share":
			fi.share(jObj);break;

		case "analytics":
			fi.analytics(jObj);break;

		case "pause":
			fi.pause(jObj);break;
			
		case "restart":
			fi.restart(jObj);break;

		case "showDiv":
			fi.showdiv(jObj); break;

		case "close":
			fi.close(jObj); break;

		default:
			//alert('uncaught fiPageComm: javascriptLocalInterface(jObj);');
		break;
	}    
}

fi = { // this is the interface for flash triggered functionality  
    analytics: function(jObj){

	var a = jObj;
	var str = '';
	
	//if jObj is a wrapper .analytics then iterate through each child and call this again
	if(a.analytics != null && a.analytics != '')
	{	//alert('jObj is analytics - set jObj as jObj.analytics!');
		try{a = jObj.analytics}
		catch (e){//alert('fi.analytics error in testing for jObj.analytics');
		}
	}
	else {	//alert('jObj NOT analytics - deal with directly'); 
	}

	var t = '';
	if (typeof(a) == 'object')
		{	if (a.webtrends)
			{	if (a.webtrends.tags)
				{	$.each(a.webtrends.tags, function(i,item) {   t+=('WT.' + i + '=' + item + '&'); })
					if(t != '') 
					{	t=t.replace(/&$/,"").replace(/#$/,"");
						str+='webtrends.tags: ' + t; 
						try {	dcsTrk(t);	}
						catch(e){	//alert('problem calling dcsTrk('+t+')');
						}
					}
					else {	str+='webtrends: tag object contains no tags';  }
				}
				else
				{	str+='webtrends: no tag object located'; 
				}
				//alert(str);
				str='';
			}
			t = '';
		}
		//else {	alert('analytics not triggered'); }
	},

	share: function(jObj){
		//manipulate obj.url to complete URL for overlay/open etc.
		//alert('IN:share');

		var shareFormURL = typeof(jObj.url) != 'undefined' ? jObj.url : '';
		var currentURL = window.location.href;
		var sectionURL = typeof(jObj.sectionURL) != 'undefined' ? jObj.sectionURL : '';
		
		//alert('shareFormURL'+shareFormURL+'\ncurrentURL'+currentURL+'\nsectionURL'+sectionURL+'\n');

		//added the url param onto the shareform url
		//  does the share form url have a ?
		shareFormURL.indexOf('?') > -1 ? shareFormURL+='&' : shareFormURL+='?';

		 // think this is supposed match and remove #string but will infact only match and remove # 
		currentURL = currentURL.replace(/#$/,"").replace(/&$/,"")
		
		if (currentURL.indexOf('#') != -1){
			currentURL = currentURL.replace(/#.*/,""); // remove #anything	
		}
		
                                var pageIndex = currentURL.indexOf("?page=");
                                if (pageIndex != -1) {
                                    var remove = currentURL.substr(pageIndex, currentURL.length);
                                    currentURL = currentURL.replace(remove, "");
                                }

                                var pageIndex = currentURL.indexOf("&page=");
                                if (pageIndex != -1) {
                                    var remove = currentURL.substr(pageIndex, currentURL.length);
                                    currentURL = currentURL.replace(remove, "");
                                }

			
		// remove params from query string
		currentURL = $.qsRemove(currentURL, "height");
		currentURL = $.qsRemove(currentURL, "width");

		currentURL = escape(currentURL);

		shareFormURL += 'url=' + currentURL

		//assumption that section url doesn't contain ampersand or questionmark - uses #
		if (sectionURL != null && sectionURL != '')
		{	shareFormURL += escape("#/"+sectionURL) //RT: amended to fix share deeplink on CT accessories page 
		}

		//alert('shareFormURL:'+shareFormURL)

		jObj.url = shareFormURL 
		//alert('move fi.share to fi.redirect at:\n ' + jObj.url);
		//embedded analytics object is tested for in the redirect
		fi.redirect(jObj); //note dependancy
		//alert('back');
		jObj = null;
		//alert('OUT:share');
	}, 

	redirect: function(jObj){
		//alert('IN:redirect');
		//		var jObjAnalytics = null //clear incase created in previous interaction
		//		if(jObj.analytics) { jObjAnalytics = jObj;} //analytics object
		//		if((jObjAnalytics != null) && (jObjAnalytics != '')) {   fi.analytics(jObjAnalytics);}

		var jObjAnalytics = jObj.analytics; //the redirect from flash will always contain the webtrends etc. within an analytics object (although this may be null)

		if(jObjAnalytics != null && jObjAnalytics != '')
		{
			fi.analytics(jObjAnalytics);
			/*
			if(jObjAnalytics.webtrends != '' && jObjAnalytics.webtrends != null){alert('got webtrends');}
			else {alert('not got webtrends');}
			*/
		}
		//else {alert('jObjAnalytics was null or empty');
		//}

		var url = jObj.url;
		var wt = jObj.window;

		if (wt == 'tour') {
			SWFAddress.setValue("/lx_ajax_tour" + url);
			$.dombox.ProcessTourLink(url);
		}
		else if (wt =='feature') {
			SWFAddress.setValue("/lx_ajax_features" + url);
			$.dombox.ProcessTourLink(url);
		}
		else {
			if (url != '' && url != undefined)
			{	if (wt == 'full') {  openWin.full(url); }
				else if (wt == 'new') {  var n=window.open(url); }
				else if (wt == 'overlay') { openOverlay(jObj); }
				else { document.location.href=url; }
			}
			//else {  alert('there was no valid url'); }   
		} 
		jObjAnalytics = null;
		jObj = null;
		//alert('OUT:redirect');
	}, 
	
	pause: function(jObj){
		//alert('IN:pause');
		try {	if((typeof(jObj)) == 'object')
				{	if(jObj.type)
					{	if(jObj.type != '')
						{	fi.pauseOrRestart(jObj);
						}
					} //else { alert('no type recieved?');}
				} //else { alert('jObj is not an object');}
			}
		catch(e) { //alert('error in pause function');
			}
		//alert('OUT:pause');
	},
	
	restart: function(jObj){
		//alert('IN:restart');
		try {	if((typeof(jObj)) == 'object')
				{	if(jObj.type)
					{	if(jObj.type != '')
							fi.pauseOrRestart(jObj)
					} //else { alert('no type recieved?');}
				} //else { alert('jObj is not an object');}
			}
		catch(e) { //alert('error in restart function');
			}
		//alert('OUT:restart');
	},

	showdiv: function(jObj){
		$.dombox.Tour_ChangePanel(jObj.id, false, false);
	},

	close: function(jObj){
		SWFAddress.setValue("");
		$.dombox.closeOverlay();
	},
	
	pauseOrRestart: function(jObj){ //internal function only!
		//alert('IN:pauseOrRestart');
		if (typeof(flashInterface) == 'function')
		{	var sDefaultFlashID = 'main_movie' 
			{	if(jObj.flashID)
				{	if(jObj.flashID != '')
					{	jObj.flashID = sDefaultFlashID }
				}
				else
				{	jObj.flashID = sDefaultFlashID;
				}
				
				if(typeof(thisMovie(jObj.flashID)) != 'undefined') 
				{	if (typeof(thisMovie(jObj.flashID).flashInterface) == 'function') 
					{	flashInterface(jObj, jObj.flashID);
					} //else {	alert('flashInterface is not available');}	
				} //else {	alert('thisMovie('+jObj.flashID+') is undefined');}
			}
		}
		//alert('OUT:pauseOrRestart');
	}
}

// opens an overlay window - default is thickbox script directly - used for Flash overlays
function openOverlay(jObj)
{   //this allows us to send either object in and use shared named vars
	if(jObj.redirect) 
	{	jObj = jObj.redirect}
	else if(jObj.share)
	{	jObj = jObj.share}

	var url = jObj.url;
	var title = null ;
	var overlayType = "thickbox";
	var width = 0;
	var height = 0;

	if(jObj.params)
	{	title = typeof(jObj.params.title) != 'undefined' ? jObj.params.title : null;
		overlayType = typeof(jObj.params.overlayType) != 'undefined' ? jObj.params.overlayType : "thickbox";
		width = typeof(jObj.params.width) != 'undefined' ? jObj.params.width : 0;
		height = typeof(jObj.params.height) != 'undefined' ? jObj.params.height : 0;
	}

	if(overlayType == "thickbox");
	{   //  does the redirect indicate to use TB_iframe? need to add id overlay mode
		url.toLowerCase().indexOf('tb_iframe=true') > -1 ? url = url.replace('tb_iframe', 'TB_iframe') : url+='&TB_iframe&';
		
		if (height > 0)
		{	url.indexOf('?') > -1 ? url = url.replace('?', '?height=' + height + '&') : url+='?height=' + height + '&';
		}
		if (width > 0)
		{	url.indexOf('?') > -1 ? url = url.replace('?', '?width=' + width + '&') : url+='?width=' + width + '&';
		}

		

		try {	var p=tb_getQueryStringParams(url);
				tb_show(title,url,false,p);
				return false;
			}
		catch(e){}
	}
	//extend for other overlay types here
}


;(function($){
    $.qsRemove = function(url, valueToRemove){
		var parsedUrl;
		var queryParams = '';		
		if (url != '' && url != null) {				
			// split into array - one item per question mark
			var urlParts = url.split('?');
			parsedUrl = urlParts[0];
			
			// remove everything but the query string from the url
			urlParts.splice(0, 1);
			
			$(urlParts).each(function(i, val){
				// split the query string into an array
				var params = val.split(/[&;]/g);
				
				$(val.split(/[&;]/g)).each(function(i, val){
					if (val.indexOf(valueToRemove + "=") != -1) {
						params.splice(i, 1);
					}
				});
				
				// rebuild string
				$(params).each(function(i, val){
					if (queryParams.indexOf("?") != -1) {
						queryParams = queryParams + "&" + val;
					}
					else {
						queryParams = "?" + val;
					}
				});
			});			
		}
		return parsedUrl + queryParams;        
    };   
})(jQuery);
// THIS CODE IS DEPENDANT ON FANCYBOX FOR LOADING EFFECT AND SWFADDRESS FOR DEEP LINKING - ENSURE SCRIPT IS INCLUDED AFTER FANCYBOX
(function($) {
    // variables
    var overlayContentMask, overlayContentEle, overlayEle, overlayInnerContentEle, overlayHeaderEle, stdContentContainer, lx_ol_btnContainSelect, SideOffset, strRelOfOpenEle, tourflashHeight, defaultContainerHeight, innersubslideEle, upperslideEle,
    lx_ol_mainMovieFlashID = "main_movie", // ID of flash movie, used to send pause command
    lx_ol_stdContentContainerID = "content", // ID of the content container
    lx_ol_overlayContentMaskID = "overlayContentMask", // ID of the overlay mask element
    lx_ol_overlayID = "overlay", // ID of the overlay element
    lx_ol_overlayHeaderID = "overlayHeader", // ID of the overlay header element (e.g. which contains the title and links)
    lx_ol_overlayContentID = "overlayContent", // ID of the overlay element which contains the content
    lx_ol_overlayInnerContentID = "overlayContentInner", // ID of the inner overlay element which contaisn the content
    lx_ol_ajax_error = "<span id=\"errorspn\">Sorry, the data could not be loaded,<br /> Please try again later.</span>", // error message for failed ajax
    lx_ol_pageWidthIncPadding = 966, // Page width inc padding
    lx_ol_ContentPadding = 22, // left + right padding of container element
    lx_ol_overlayHeaderHeight = 50, // height of the overlay header elemen
    lx_ol_tourFlashHeaderHeight = 42, // Height of the title in the tour / feature flash, used to position final slide just under the flash title
    lx_ol_tourUpperslideID = "upperslide", // ID of element used for tour / feature contnet animation
    lx_ol_animRate = 700, // Animation rate for all jquery animations in the plugin
    lx_ol_tourSlideDelimit = "~", // delimiter character in deep linking path
    lx_ol_TourSlideContainerSelect = "#innersubslide", // ID of inner element used for tour / feature contnet animation
    lx_ol_TourSlideSelect = ".tourslide", // class of tour slide HTML content blocks, if elements with this class are found in data from ajax tour methods are called
    lx_ol_overlayContentMaskOpacity = 0.5, // Opacity of overlay mask
    lx_ol_isIE6 = !$.support.opacity && !window.XMLHttpRequest, // bool to let us know if running in IE6
    lx_ol_base = window.location.href.substring(0, window.location.href.lastIndexOf("/") + 1), // current base page path, when closing links in IE they become absolute so we remove this string from the cloned link href
    lx_inlineFunctionsCalled = 'nullFn', // String to persist values of inline funcitons called (currently not used)
    lx_inlineFunctionName = "nullFn", // String to persist values of inline funcitons name (currently not used)
    lx_escapeWTname = true, // Escape / URL encode the title of the info block
    overlayInPlace = false, // bool to persist the overlay status
    bolTourAnimActive = false, // bool to check if a tour animation is active, and queue calls if it is active
    lx_ol_tourFunctionQueue = []; // Array to hold queued tour functions

    // Call the init function on load to create the overlay divs
    $(document).ready(function() {
        // Check we're not an iframe
        if (window.location == window.parent.location) {
            dombox_init();
        }
    });

    // ---------------------------------------------
    // Public methods - called from outside class
    // ---------------------------------------------
    // Function called by content pages to bind click events to top links, and clone these links and the H1 into the overlay header element
    $.dombox = function(
            strLinkSelect, // CSS select to get the UL element containing the top links so they can be bound and cloned
            bolCloneLinks, // Bool to set if the top links should be cloned
            strHeaderover, // String containing the header to add to the overlay header, should be a H1 elements
            intSideOffset // internal margin for overlay, currently always 0
        ) {
        lx_ol_btnContainSelect = strLinkSelect; // Set the global button select variable
        SideOffset = intSideOffset; // Set the global off set variable (e.g. internal margin for overlay), currently unused
        overlayContentEle.css({ "opacity": 0 });
        dombox_setWidths(SideOffset);
        $.dombox.bindLinks(strLinkSelect + " a", false);
        overlayHeaderEle.prepend(strHeaderover);
        dombox_call_tidy_functions($(document));
        if (bolCloneLinks) {
            var linksToClone = $(strLinkSelect).clone();
            overlayHeaderEle.prepend(linksToClone);
            $.dombox.bindLinks("#" + lx_ol_overlayID + "  " + strLinkSelect + " a", false);
        }
    }
    // Public method to bind click events to A href elements to allow them to launch an overlay
    $.dombox.bindLinks = function(
        cssSelect, // CSS select to select the A href elements to bind
        isCloseLink // Bool to set if these links should force the closure of an overlay / are close links
        ) {
        $(cssSelect).bind("click", function(evt) {
            if (!$(this).hasClass("href")) { // we dont bind if links have class href as the CMS add this class for non overlay top links
                evt.preventDefault();
                if (isCloseLink) { $.dombox.closeOverlay(); }
                else { $.dombox.showOverlayFromHTML(this); }
            }
        });
    }
    // Public method bound to the click of A hrefs to launch an overlay based on the a hrefs attributes
    $.dombox.showOverlayFromHTML = function(Btn) {
        var jqBtn = $(Btn);
        var BtnHref = jqBtn.attr("href"); // Href is used as datasource, either a page to ajax, or anchor link to clone in inline content
        var BtnRel = jqBtn.attr("rel"); // Rel attribute is used to group links, required as links are cloned into overlay header
        var dataType = "";
        // Class is used to control datasource method (ajax or inline( inline is called print))
        if (jqBtn.hasClass("ajax")) {
            dataType = "ajax";
        }
        else if (jqBtn.hasClass("print")) {
            dataType = "print";
            // clean the href attribute as in IE its prefixed with pagename after cloning
            if (BtnHref.indexOf('#') >= 0) {
                BtnHref = BtnHref.slice(BtnHref.indexOf('#'));
            }
        }
        dombox_processOverlay(dataType, BtnHref, BtnRel, false, "");
    }
    // Public method to close the overlay
    $.dombox.closeOverlay = function() {
        dombox_processOverlay("", "", "", true, "");
        SWFAddress.setValue("");
    }
    // Public method to show and overlay with required paramater variables
    $.dombox.showOverlayFromJSON = function(
        strDataType, // AJAX or print
        strDataSource, // URL for AJAX or anchor refrence
        strRelatedBtnRel // Rel attribure, top links with this rel will have the CSS on class assigned when overlay opens
        ) {
        dombox_processOverlay(strDataType, strDataSource, strRelatedBtnRel, false, "");
    }
    // Public method to change the tour slide / feature, called from flash via fiPageComm function
    $.dombox.Tour_ChangePanel = function(
        strEleToShowID, // ID of the tour slide / feature to show
        bolPlaceOverFlash, // Bool to say if this slide should be placed over the flash, currently unused, slide is positioned over flash if the div has the class 'openover' which is added by CMS 
        bolIsInitCall // Bool to say if this in an init call, if true browser is scroll to the top of the page
        ) {
        dombox_Tour_ChangePanel(strEleToShowID, bolPlaceOverFlash, bolIsInitCall);
    }
    // Public method to check the an anchor refrence (window.location.hash) if deep links and call FancyBoc / overlay as needed
    $.dombox.ProcessDeepLink = function(strAnchorLinkValue) {
        strAnchorLinkValue = strAnchorLinkValue.substring(1);
        var strDataType, strDataSource;
        var rgxTourRegex = /^\/lx_ajax_tour/;
        var rgxFeatureRegex = /^\/lx_ajax_features/;
        var rgxPrintRegex = /^\/lx_inline/;
        var rgxImageRegex = /^\/fb_image/;
        var rgxFlashRegex = /^\/fb_inline/;
        var rgxiFrameRegex = /^\/fb_iframe/;
        var FeatureMatches = strAnchorLinkValue.match(rgxFeatureRegex);
        var TourMatches = strAnchorLinkValue.match(rgxTourRegex);
        var PrintMatches = strAnchorLinkValue.match(rgxPrintRegex);
        var ImageMatches = strAnchorLinkValue.match(rgxImageRegex);
        var FlashMatches = strAnchorLinkValue.match(rgxFlashRegex);
        var iFrameMatches = strAnchorLinkValue.match(rgxiFrameRegex);
        // Match for tours or features
        if (FeatureMatches != null || TourMatches != null) {
            strDataSource = strAnchorLinkValue.substring(strAnchorLinkValue.indexOf("\/", 1));
            $.dombox.ProcessTourLink(strDataSource);
        }
        // Match for inline content
        else if (PrintMatches != null) {
            strDataType = "print";
            strDataSource = strAnchorLinkValue.substring((strAnchorLinkValue.indexOf("\/", 1) + 1));
            dombox_processOverlay(strDataType, strDataSource, "", false, "");
        }
        // Match standard image, displayed in fancybox
        else if (ImageMatches != null) {
            strDataSource = strAnchorLinkValue.substring((strAnchorLinkValue.indexOf("\/", 1) + 1));
            $.fancybox({ 'href': strDataSource });
        }
        // Match for inline content to be displayed in fancy box (e.g. CMS video, currently unused)
        else if (FlashMatches != null) {
            strDataSource = strAnchorLinkValue.substring(strAnchorLinkValue.indexOf("\/", 1));
            $.fancybox({ 'href': strDataSource });
        }
        // Match for Iframe fancybox items (youtube!)
        else if (iFrameMatches != null) {
            strDataSource = strAnchorLinkValue.substring((strAnchorLinkValue.indexOf("\/", 1) + 1));
            $.fancybox({ 'href': strDataSource, 'type': 'iframe' });
        }
    }
    // Open a tour overlay only from a URL with deep link syntax, parses this tour AJAX page and slide ID from URL string
    $.dombox.ProcessTourLink = function(strTourLink) {
        strTourFocusRef = strTourLink.substring(1, strTourLink.indexOf("\/", 1));
        strTourFocusRef = (strTourFocusRef.indexOf('~') >= 0 || strTourFocusRef.indexOf('\/') >= 0) ? "" : strTourFocusRef;
        var strTourFocusRef;
        if (strTourLink.indexOf(lx_ol_tourSlideDelimit) >= 0) {
            strTourLink = strTourLink.substring((strTourLink.indexOf(lx_ol_tourSlideDelimit) + lx_ol_tourSlideDelimit.length));
        }
        dombox_processOverlay("ajax", strTourLink, "", false, strTourFocusRef);
    }
    // ---------------------------------------------
    // Private methods - only exposed within the class
    // ---------------------------------------------
    // Initialisation function called on page load to create the overlay divs and bind re-size events etc
    dombox_init = function() {
        // Create the overlay elements, setting them to class wide variables
        if (!$("#" + lx_ol_overlayContentMaskID).length) {
            $('body').append(
		        overlayContentMask = $('<div id="' + lx_ol_overlayContentMaskID + '"></div>'),
		        overlayEle = $('<div id="' + lx_ol_overlayID + '"></div>')
	        );
            $(overlayEle).append(
	            overlayHeaderEle = $('<div id="' + lx_ol_overlayHeaderID + '"></div>'),
	            overlayContentEle = $('<div id="' + lx_ol_overlayContentID + '"></div>')
	        );
            $(overlayContentEle).append(
	            overlayInnerContentEle = $('<div id="' + lx_ol_overlayInnerContentID + '"></div>')
	        );
        }
        stdContentContainer = $("#" + lx_ol_stdContentContainerID);

        try {
                // Ensure the top position of the overlay header is correct, some other scripts re-arrange the header so we need to do this a couple of times thought out class...
                overlayEle.css({ "top": stdContentContainer.position().top + "px" });
                $.dombox.bindLinks("#" + lx_ol_overlayContentMaskID, true);
                dombox_setWidths(SideOffset);
                // Bind resize events to ensure correct overlay position
                $(window).resize(function() {
                    dombox_setWidths(SideOffset);
                });
                // IE6 specific 
                if (lx_ol_isIE6) {
                    dombox_setIE6MaskHeight(); // Set the overlay mask height in IE6 as it doesnt support fixed positioning
                    overlayEle.addClass('ie6'); // Add a class for CSS dx filters etc
                }
                // If we have anchor / hash link run it through the deep link method
                var CurrentAnchorLink = window.location.hash;
                if (CurrentAnchorLink.length > 1) { $.dombox.ProcessDeepLink(CurrentAnchorLink); }
        }
        catch (err){}
    }

    // Process the overlay - fade in content and call Tour functions as needed
    dombox_processOverlay = function(strDataType, strDataSource, strBtnRel, bolCloseBtnClick, strTourFocusRef) {
        var bolIsCloseCall = false;
        // Set as close call if source rel attr of event source button matches the overlay already open
        if ((strRelOfOpenEle == strBtnRel && strRelOfOpenEle != "") || bolCloseBtnClick) {
            bolIsCloseCall = true;
        }
        strRelOfOpenEle = strBtnRel; // Persist the rel attr of of the source button
        overlayContentEle.stop();
        if (!overlayContentEle.hasClass("open")) {
            dombox_addOverlay(Open);
        }
        else {
            Close();
        }
        // Function load load in and display a new overlay chunk of content
        function Open() {
            overlayContentEle.addClass("open");
            // add the on class based on the rel attr of the top links
            $(lx_ol_btnContainSelect + " a").each(
                function() {
                    if (this.rel == strRelOfOpenEle) {
                        $(this).addClass("on");
                    }
                }
            );
            $.fancybox.showActivity();
            // Bring in the content
            if (strDataType == "ajax") {
                dombox_ajaxInContent(strDataSource, overlayInnerContentEle, ContentLoadComplete, "", "");
            }
            else if (strDataType == "print") {
                dombox_printInContent(strDataSource.replace(lx_ol_base, ""), overlayInnerContentEle, ContentLoadComplete, "", "");
            }
            // Content load complete function
            function ContentLoadComplete() {
                $.fancybox.hideActivity();
                // If we find tour slides call the tour init function, otherwise move on to adjusting the content container height
                if ($(lx_ol_TourSlideContainerSelect + " " + lx_ol_TourSlideSelect).length > 0) {
                    dombox_TourInit(lx_ol_TourSlideContainerSelect + " " + lx_ol_TourSlideSelect, strTourFocusRef);
                }
                else {
                    dombox_setHeights(false, 0, setHeightDone);
                }
                // once the height is set fade in the content
                function setHeightDone() {
                    dombox_call_tidy_functions(overlayInnerContentEle);
                    overlayContentEle.animate({ "opacity": 1 }, lx_ol_animRate, function(evt) {
                        overlayContentEle.css({ "opacity": "" }); // remove the opacity style as bug work around to PNGs in IE6
                        dombox_addCloseBtn(); // PNG clode button can be added now opacity is removed
                    });
                }
                // tidy up headers if present in the content
                //remove fixed height
                $('.overlaycc10.ccsitemap.colnum3 .headerblock').css({ "height": "auto" });
                var largestHeader = 0;
                $('.overlaycc10.ccsitemap.colnum3 .headerblock').each(function() {
                    if ($(this).outerHeight() > largestHeader) {
                        largestHeader = $(this).outerHeight();
                   }
                });
                //set all headers to largest height
                $(".overlaycc10.ccsitemap.colnum3 .headerblock").css({ "height": largestHeader });

            }
        }
        // Function to fade out existing cotnent ovelay, and remove the mask or load new overlay as needed
        function Close() {
            // remove close button prior to opacity animation to work around IE6 PNG issues
            dombox_removeCloseBtn();
            overlayContentEle.animate({ "opacity": 0 }, lx_ol_animRate, function(evt) {
                // Need to remove Sifr alterations before ele is removed or IE errors
                $('.sIFR-replaced', overlayInnerContentEle).each(function(index, value) {
                    $(this).html(($('span'), $(this)).text());
                    $(this).removeClass('sIFR-replaced');
                });
                // restore inline cotnent back to its original div after being moved to overlay, and clear out overlay
                var temp = overlayInnerContentEle.clone();
                if ($('#db-temp').length > 0) {
                    $('#db-temp').replaceWith(temp.html());
                }
                overlayInnerContentEle.empty();
                // Remove the on class from associated top link unless it has a permaon class (assigned by CMS)
                $(lx_ol_btnContainSelect + " a").each(
                    function() { if (((this.rel != strRelOfOpenEle) || (bolIsCloseCall)) && !$(this).hasClass("permaon")) { $(this).removeClass("on"); } }
                );
                // If this isnt a close call now load the new content overlay, else remove the overlay mask
                if (!bolIsCloseCall) {
                    Open();
                }
                else {
                    dombox_removeOverlay(null);
                    overlayContentEle.removeClass("open");
                }
            });
        }
    }
    // Function to perform inital setup of tours / features
    dombox_TourInit = function(containerRef, strTourFocusRef) {
        // Clear the tour slide change function queue
        lx_ol_tourFunctionQueue = [];
        var container = $(containerRef);
        if (container.length > 0) {
            // Hide all the tour panels in the overlay tour content, only 1 is displayed at any time
            container.each(function(index, value) {
                $(this).addClass("hiddenprintcontent");
                if (index == 0 && strTourFocusRef == "") {
                    strTourFocusRef = $(this).attr("id"); // if tour ID of a slide to show is provided get the ID of the first slide
                }
            });
            innersubslideEle = $(lx_ol_TourSlideContainerSelect);
            $('<div id="' + lx_ol_tourUpperslideID + '"></div>').insertBefore(innersubslideEle);
            upperslideEle = $("#" + lx_ol_tourUpperslideID);
            tourflashHeight = overlayInnerContentEle.height();
            // Content is now configured and heights set so call the function to animate heights and fade in tour content
            dombox_Tour_ChangePanel(strTourFocusRef, false, true);
        }
    }
    // Function to add a close button to the overlay
    dombox_addCloseBtn = function() {
        var closeButton = $('<a id="closelink" class="closeover" href="#"></a>');
        closeButton.bind("click", function(evt) {
            evt.preventDefault();
            $.dombox.closeOverlay();
        });
        overlayInnerContentEle.prepend(closeButton);
    }
    // Function to remove a close button from the overlay
    dombox_removeCloseBtn = function() {
        $('#closelink').remove();
    }
    // Function to fade in the content overlay mask
    dombox_addOverlay = function(Callback) {
        if (!overlayInPlace) {
            overlayInPlace = true;
            // Try to pause the flash
            try {
                if (typeof (fiPageComm) == 'function') {
                    var oPause = { type: 'pause', flashID: lx_ol_mainMovieFlashID };
                    fiPageComm(oPause);
                    oPause = null;
                }
            }
            catch (e) {  //alert('tb>pause error\n' + e);
            }
            // Re-check the positioning and heights etc of the overlay
            defaultContainerHeight = stdContentContainer.height();
            overlayEle.css({ "top": stdContentContainer.position().top + "px", "display": "block" });
            dombox_setWidths(SideOffset);
            overlayContentMask.stop();
            overlayContentMask.css({ "display": "block", "opacity": 0 });
            overlayContentMask.animate({ "opacity": lx_ol_overlayContentMaskOpacity }, lx_ol_animRate, function(evt) {
                // Add bind escape key close now ovellay is present
                $(document).unbind('keydown.db').bind('keydown.db', function(e) {
                    if (e.keyCode == 27) {
                        e.preventDefault();
                        $.dombox.closeOverlay();
                    }
                });
                // Call callback function if provided
                checkAndCallCallback(Callback);
            });
        }
        else { checkAndCallCallback(Callback); }
        // Set IE6 overlay mask height
        if (lx_ol_isIE6) { dombox_setIE6MaskHeight(); }
    }
    // Function to fade out the content overlay mask
    dombox_removeOverlay = function(Callback) {
        // remove escape key bind
        $(document).unbind('keydown.db');
        if (overlayInPlace) {
            overlayInPlace = false;
            // try to unpause flash
            try {
                if (typeof (fiPageComm) == 'function') {
                    var oRestart = { type: 'restart', flashID: lx_ol_mainMovieFlashID };
                    fiPageComm(oRestart);
                    oPause = null;
                }
            }
            catch (e) { //alert('tb>pause error\n'+e);
            }
            // Fade out overlay mask
            overlayContentMask.stop();
            dombox_setHeights(true, 0, null);
            overlayContentMask.animate({ "opacity": 0 }, lx_ol_animRate, function(evt) {
                overlayEle.css({ "display": "none" });
                overlayContentMask.css({ "display": "none" });
                // Call callback function if provided
                checkAndCallCallback(Callback);
            });
        }
        else { checkAndCallCallback(Callback); } // Call callback function if provided
        // Set IE6 overlay mask height
        if (lx_ol_isIE6) { dombox_setIE6MaskHeight(); }
        // Clear the tour function queue
        lx_ol_tourFunctionQueue = [];
    }
    // Function which handles the fade in of a tour overlay, and the chaning of the tour panels / features
    dombox_Tour_ChangePanel = function(
        strEleToShowID, // ID of the slide to be shown (if blank first slide is shown(
        bolPlaceOverFlash, // Bool to set if this panel should be positioned over the flash
        bolIsInitCall // Bool to set if this is an openeing call
        ) {
        // If no animation action let get started
        if (!bolTourAnimActive) {
            bolTourAnimActive = true;
            // Scroll to top if openeing for first time (to accomodate a link from the bottom of a long page)
            if (bolIsInitCall) { scroll(0, 0); }
            // Grab the current and next slides
            var curEle = $(".subopen"), nextele = $("#" + strEleToShowID), persistHeight = 0;
            // Code to deal with an invalid or empty tour panel ID
            if (curEle.attr("id") == strEleToShowID || nextele.length == 0) {
                // If invalid ID provided and is an opening call grab the first element
                if (nextele.length == 0 && bolIsInitCall) {
                    nextele = $('.tourslide:first', overlayInnerContentEle);
                }
                // Other wise just ignore the request and proceed to the tidy up function
                else {
                    endTourChange();
                    return false;
                }
            }
            // If we have a panel already open store its height for animation and then fade it out
            if (curEle.html() != null) {
                curEle.removeClass("subopen");
                persistHeight = curEle.outerHeight();
                curEle.animate({ "opacity": 0 }, lx_ol_animRate, function(evt) { processPanelChange(); });
            }
            else {
                processPanelChange();
            }
        }
        // if animation already in progress add function call to queue (clear queue first)
        else {
            lx_ol_tourFunctionQueue = [];
            lx_ol_tourFunctionQueue.push(dombox_wrapFN(dombox_Tour_ChangePanel, stdContentContainer, [strEleToShowID, bolPlaceOverFlash, bolIsInitCall]));
        }
        // Process the loading of a panel once previous panel (if there was one) has been faded out
        function processPanelChange() {
            // If previous slide was positioned over the flash then clean out as these slides are cloned into a differnt div
            if (upperslideEle.hasClass("subopenOF")) {
                upperslideEle.removeClass("subopenOF");
                upperslideEle.html("");
            }
            // Set the height, workaround for IE6 animation bug
            else {
                if (persistHeight > 0) {
                    innersubslideEle.css({ "height": persistHeight + "px" });
                }
                else {
                    innersubslideEle.css({ "height": 0 + "px" });
                }
            }
            // now get the height of the tour panel we are going to fade in
            persistHeight = nextele.outerHeight();
            // Code which positions an tour panel over the flash (e.g. final slide / next steps)
            if (nextele.hasClass("openover") || bolPlaceOverFlash) {
                upperslideEle.css({ "opacity": 0, "display": "block" }); // Ensure the element we use to display contet over the flash is opacity 0
                upperslideEle.html(nextele.html()); // Check the tour slide HTML into the element we use to display contet over the flash
                upperslideEle.addClass("subopenOF subopen"); // Add a class to the element so we know next time that the conten is over the flash
                // Work out the animation heights based on page height etc
                var issHeight = ((persistHeight + lx_ol_tourFlashHeaderHeight + lx_ol_overlayHeaderHeight) > defaultContainerHeight) ? (persistHeight - (tourflashHeight - lx_ol_tourFlashHeaderHeight)) : (defaultContainerHeight - (tourflashHeight + lx_ol_overlayHeaderHeight));
                issHeight = (issHeight > 0) ? issHeight : 0;
                var ccontainHeight = ((persistHeight + lx_ol_tourFlashHeaderHeight + lx_ol_overlayHeaderHeight) > (tourflashHeight + lx_ol_tourFlashHeaderHeight)) ? (persistHeight + lx_ol_tourFlashHeaderHeight + lx_ol_overlayHeaderHeight) : (tourflashHeight + lx_ol_tourFlashHeaderHeight);
                dombox_setHeights(false, ccontainHeight, null);
                innersubslideEle.animate({ "height": issHeight + "px" }, lx_ol_animRate, function(evt) {
                    dombox_call_tidy_functions(overlayInnerContentEle);
                    // Once animation complete, fade in the content
                    upperslideEle.animate({ "opacity": 1 }, lx_ol_animRate, function(evt) {
                        fadeInContentLayer();
                    });
                });
            }
            // Standard code for positioning tour panel under the flash
            else {
                // ensure div is opacity 9
                nextele.css({ "opacity": 0 });
                // Mark it as open
                nextele.addClass("subopen");
                // Work out the animation heights based on page height etc
                dombox_setHeights(false, (persistHeight + tourflashHeight + lx_ol_overlayHeaderHeight), null);
                innersubslideEle.animate({ "height": persistHeight + "px" }, lx_ol_animRate, function(evt) {
                    dombox_call_tidy_functions(overlayInnerContentEle);
                    // Once animation complete, fade in the content
                    nextele.animate({ "opacity": 1 }, lx_ol_animRate, function(evt) {
                        fadeInContentLayer();
                    });
                });
            }
            // Generic tour function to fade in content layer
            function fadeInContentLayer() {
                if (overlayContentEle.css("opacity") == 0) {
                    overlayContentEle.animate({ "opacity": 1 }, lx_ol_animRate, function(evt) {
                        overlayContentEle.css({ "opacity": "" });
                        endTourChange();
                    });
                }
                else { endTourChange(); }
            }
        }
        // End tour change function, checks the function queue for queued events and executes them
        function endTourChange() {
            bolTourAnimActive = false;
            if (lx_ol_tourFunctionQueue.length > 0) {
                (lx_ol_tourFunctionQueue.shift())();
            }
        }
    }
    // Function to wrap up a function call for future use
    dombox_wrapFN = function(fn, context, params) {
        return function() {
            fn.apply(context, params);
        };
    }
    // Allows a callback function to be called as long as the paramater was not numm
    checkAndCallCallback = function(Callback) {
        if (Callback != null) {
            Callback();
        }
    }
    // Generic function to AJAX in content to a specific div
    dombox_ajaxInContent = function(
        strDataURL, // Path to AJAX page to load
        targetEle, // Element object to insert content into
        strCompleteFunctionName, // Function to callback once ajax load compelte, Null for none
        preFixHTML, // HTML to prefix the content from AJAX request (currently unused)
        suffixHTML // HTML to suffic the content from AJAX request
        ) {
        $.ajaxSetup({
            cache: false
        });
        aj = $.ajax({
            type: "GET",
            url: $.trim(strDataURL),
            dataType: 'html',
            success: function(html) {
                targetEle.html(preFixHTML + html + suffixHTML);
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                targetEle.html(preFixHTML + lx_ol_ajax_error + "<br />Status: " + textStatus + suffixHTML);
            },
            complete: function() {
                checkAndCallCallback(strCompleteFunctionName);
            }
        });
    }
    dombox_printInContent = function(
        strDataSel, // CSS select for inline content load clone, e.g. #mydiv
        targetEle, // Element object to insert content into
        strCompleteFunctionName, // Function to callback once ajax load compelte, Null for none
        preFixHTML, // HTML to prefix the content from AJAX request (currently unused)
        suffixHTML // HTML to suffic the content from AJAX request
        ) {
        // Store the content we will inject
        var divContentToInject = $(strDataSel).html();
        // Replace the inline content with a temp div to ensure we have duplicate elements
        var tmp = $('<div id="db-temp"></div>');
        $(strDataSel).html(tmp);
        targetEle.html(preFixHTML + divContentToInject + suffixHTML);
        // If the line content contained flash to embed the SWF object embed code will be wrapped in a function name equal to the ID of the inline content div
        lx_inlineFunctionName = strDataSel.slice(1);
        // Check the function has now been called before, it it has the flash would already be embdeded in the hidden div so should not call it again
        if (lx_inlineFunctionsCalled.indexOf('#' + lx_inlineFunctionName + '#') < 0) {
            // If there is a function with the same name then execute it
            if (typeof (window[lx_inlineFunctionName]) === "function") {
                window[lx_inlineFunctionName]();
                // now the funciton is called and flash embdeded persist this function name to prevent it being called again
                lx_inlineFunctionsCalled += '#' + lx_inlineFunctionName + '#';
            }
            else {
                //alert("Error.  Function " + inlineFunctionName + " does not exist.");
            }
        }
        checkAndCallCallback(strCompleteFunctionName);
    }
    // Function to set to horizonal position of the overlay div to ensure it sits correctly on top of the normal webpage content element
    dombox_setWidths = function(intSideOffset) {
        var targetEleWidth = lx_ol_pageWidthIncPadding - (intSideOffset * 2);
        var vpW = $(window).width();
        if (vpW > targetEleWidth) {
            overlayEle.css({ "margin-left": (((vpW - targetEleWidth) / 2)) + "px" });
        }
        else {
            overlayEle.css({ "margin-left": 0 + "px" });
        }
    }
    // Function with animates the height of the main page content div to ensure footer links etc are visible below the overlay content
    dombox_setHeights = function(bolReset, intHeightOver, completeHeightFunction) {
        // Work out and check target heights
        var targetHeight = overlayEle.height() - lx_ol_ContentPadding;
        if ((!isNaN(intHeightOver)) && (intHeightOver > 0)) { targetHeight = intHeightOver; }
        stdContentContainer.css({ "height": stdContentContainer.height() + "px" });
        // Ensure the top position of the overlay header is correct, some other scripts re-arrange the header so we need to do this a couple of times thought out class...
        overlayEle.css({ "top": stdContentContainer.position().top + "px" });
        // Perform animation, includes checks around modes, page height and some IE6 work arounds
        if (!bolReset && targetHeight > defaultContainerHeight) {
            stdContentContainer.animate({ "height": targetHeight + "px" }, lx_ol_animRate, function(evt) { checkAndCallCallback(completeHeightFunction); });
        }
        else {
            stdContentContainer.animate({ "height": defaultContainerHeight + "px" }, lx_ol_animRate, function(evt) {
                if (bolReset) {
                    stdContentContainer.css({ "height": "auto" });
                    defaultContainerHeight = stdContentContainer.height();
                    stdContentContainer.css({ "height": defaultContainerHeight });
                }
                checkAndCallCallback(completeHeightFunction);
            });
        }
        if (lx_ol_isIE6) { dombox_setIE6MaskHeight(); }
    }
    // Sets the IE6 mask height as IE6 does not support fixed positioning, using this function as needed removes the need for CSS expressions which effected performance of animations
    dombox_setIE6MaskHeight = function() {
        var targetHeight = ($(window).height() > $(document).height()) ? $(window).height() : $(document).height();
        overlayContentMask.css({ "height": (targetHeight + 60) + "px" });
    }
    // Calls the tidy functions to ensure content in overlays is configured correctly
    dombox_call_tidy_functions = function(eleToBindWithin) {
        // Add SIFR for content ajaxed in since page load
        if (typeof (window["SWFReplace"]) === "function") {
            SWFReplace();
        }
        // Add thickbox bind to content ajaxed in since page load
        if (typeof (window["tb_init"]) === "function") {
            tb_init('a.thickbox');
        }
        // Elements with this class (assigned by CMS) are links to tours, and need to have the tour functions bound to their click
        $('.domboxbind', eleToBindWithin).each(function(index, value) {
            $(this).unbind('click');
            $(this).removeAttr('onclick'); // Workaround for webtrends issue - we call the track ourself later
            $(this).bind("click", function(evt) {
                evt.preventDefault();
                var thishref = $(this).attr('href');
                var strText = $(this).text();
                if (typeof (window["dcsTrk"]) === "function") {
                    if (lx_escapeWTname) { dcsTrk('WT.ac=' + escape(strText)); }
                    else { dcsTrk('WT.ac=' + strText); }
                }
                SWFAddress.setValue("/lx_ajax_tour/~" + thishref);
                $.dombox.showOverlayFromHTML(this);
            });
        });

        // Elements with this class (assigned by CMS) are links to overview sections
        $('.ccheaderlink .overlay', eleToBindWithin).each(function(index, value) {
            $(this).unbind('click');
            $(this).bind("click", function(evt) {
                evt.preventDefault();
                var thishref = $(this).attr('href');
                var strText = $(this).text();
                //Set Web Trends Value
                var strWTValue = ($(this).attr("data-analytic-value")) ? $(this).attr("data-analytic-value") : strText;
                if (typeof (window["dcsTrk"]) === "function") {
                    if (lx_escapeWTname) { dcsTrk('WT.pc=' + escape(strWTValue) + '&WT.pn=Menu&WT.ev_act=Overview'); }
                    else { dcsTrk('WT.pc=' + strText + '&WT.pn=Menu&WT.ev_act=Overview'); }

                }
                if ($(this).hasClass("print"))
                    SWFAddress.setValue("/lx_inline/" + thishref);
                else
                    SWFAddress.setValue("/lx_ajax_tour/~" + thishref);
                $.dombox.showOverlayFromHTML(this);
            });
        });
    }
})(jQuery);
function Serialise(Item) {
    var ret = '';

    for (var item in Item) {
        try { ret += item + '|' + Item[item] + '\n'; }
        catch (e) { }
    }

    return ret;
}

///-class-/////////////////////////////////////////////////////////////////////
///
/// Name:   Carousel
/// Desc:   A JavaScript carousel
/// Author: Doug Greenall
///
///////////////////////////////////////////////////////////////////////////////
function Carousel(ID, SourceDivID, bolUsingProxy) {
    ///-flags et al-///////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////
    Carousel.ContentType =
    {
        Image: 1 << 0
        , Video: 1 << 1
    };

    Carousel.ShowYouTubeDesc = true;
    Carousel.ShowFlickrDesc = true;
    Carousel.velocity = getQuerystringCarousel('velocity', 2.25);
    Carousel.velocityMin = getQuerystringCarousel('velocityMin', 0.235);
    Carousel.scalar = getQuerystringCarousel('scalar', 0.968);

    Carousel.LoadingImage = new Image();
    Carousel.LoadingImage.src = '/Images/loadingAnimation_tcm613-605117.gif';
    Carousel.LoadingImage.width = 16;
    Carousel.LoadingImage.height = 16;
    Carousel.FireWebTrendsOnOpen = true;
    Carousel.FireWebTrendsOnFilter = true;

    Carousel.IE = 0;
    Carousel.WebKit = (navigator.userAgent.toLowerCase().indexOf('webkit') > -1);

    if (navigator.appVersion.indexOf('MSIE') > -1) {
        try { Carousel.IE = parseFloat(navigator.appVersion.split('MSIE')[1]); }
        catch (e) { Carousel.IE = 0; }
    }


    ///-class-/////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////
    Carousel.MouseTracker = function() {
        ///-data-//////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////
        var This = this;

        this._buttonDown = false;

        this._position = { X: 0, Y: 0 };
        this._lastPosition = { X: 0, Y: 0 };
        this._offset = { X: 0, Y: 0 };

        this._timer = 0;
        this._acceleration = { X: 0, Y: 0 };
        this._stopSelect = false;

        this._mouseUp = null;
        this._mouseDown = null;
        this._mouseMove = null;


        ///-methods-///////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   GetMousePosition
        /// Class:  Carousel.MouseTracker
        /// Desc:   Gets the mouse position in the browser window
        ///
        ///////////////////////////////////////////////////////////////////////
        if (Carousel.WebKit) {
            this.GetMousePosition = function(Event) {
                return { X: Event.clientX + document.body.scrollLeft,
                    Y: Event.clientY + document.body.scrollTop
                };
            };
        }
        else {
            this.GetMousePosition = function(Event) {
                return { X: Event.clientX + document.documentElement.scrollLeft,
                    Y: Event.clientY + document.documentElement.scrollTop
                };
            };
        }

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   MouseUp
        /// Class:  Carousel.MouseTracker
        /// Desc:   Mouse button up event handler
        ///
        ///////////////////////////////////////////////////////////////////////
        this.MouseUp = function(Event) {
            this._buttonDown = false;

            this.AllowSelect();

            if (this._mouseUp)
                this._mouseUp(Event);
        };

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   MouseDown
        /// Class:  Carousel.MouseTracker
        /// Desc:   Mouse button down event handler
        ///
        ///////////////////////////////////////////////////////////////////////
        this.MouseDown = function(Event) {
            this._buttonDown = true;

            if (this._mouseDown)
                this._mouseDown(Event);
        };

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   MouseMove
        /// Class:  Carousel.MouseTracker
        /// Desc:   Mouse move event handler
        ///
        ///////////////////////////////////////////////////////////////////////
        this.MouseMove = function(Event) {
            ++this._timer;

            this._lastPosition.X = this._position.X;
            this._lastPosition.Y = this._position.Y;

            delete this._position;
            this._position = this.GetMousePosition(Event);

            this._offset.X += this._position.X - this._lastPosition.X;
            this._offset.Y += this._position.Y - this._lastPosition.Y;

            this._acceleration.X = this._offset.X / this._timer;
            this._acceleration.Y = this._offset.Y / this._timer;

            if (window.opera && this._buttonDown && this._stopSelect) {
                try { document.getElementById('operaNoSelect').focus(); }
                catch (e) { }
            }

            if (this._mouseMove)
                this._mouseMove(Event);
        };

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   Reset
        /// Class:  Carousel.MouseTracker
        /// Desc:   Resets the mouse tracker's tracking vars
        ///
        ///////////////////////////////////////////////////////////////////////
        this.Reset = function() {
            this._offset.X = 0;
            this._offset.Y = 0;

            this._timer = 0;

            this._acceleration.X = 0;
            this._acceleration.Y = 0;
        };

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   AllowSelect
        /// Class:  Carousel.MouseTracker
        /// Desc:   Allows the user to select text by dragging with the mouse
        ///
        ///////////////////////////////////////////////////////////////////////
        this.AllowSelect = function() {
            if (this._stopSelect) {
                try {
                    this._stopSelect = false;

                    if (window.detachEvent) {
                        document.detachEvent('onselectstart', This.ReturnFalse);
                    }
                    else {
                        document.getElementById('site').style.MozUserSelect = '';
                        document.getElementById('site').style.KhtmlUserSelect = '';
                    }
                }
                catch (e) { }
            }
        };

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   StopSelect
        /// Class:  Carousel.MouseTracker
        /// Desc:   Stops the user selecting text by dragging with the mouse
        ///
        ///////////////////////////////////////////////////////////////////////
        this.StopSelect = function() {
            if (!this._stopSelect) {
                try {
                    this._stopSelect = true;

                    if (window.attachEvent) {
                        document.attachEvent('onselectstart', This.ReturnFalse);
                    }
                    else {
                        document.getElementById('site').style.MozUserSelect = 'none';
                        document.getElementById('site').style.KhtmlUserSelect = 'none';
                    }
                }
                catch (e) { }
            }
        };

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   ReturnFalse
        /// Class:  Carousel.MouseTracker
        /// Desc:   Used to remove events in IE
        ///
        ///////////////////////////////////////////////////////////////////////
        this.ReturnFalse = function() {
            return false;
        };

        ///-events-////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////
        if (document.addEventListener) {
            document.addEventListener("mouseup", function(Event) { This.MouseUp(Event); }, false);
            document.addEventListener("mousedown", function(Event) { This.MouseDown(Event); }, false);
            document.addEventListener("mousemove", function(Event) { This.MouseMove(Event); }, false);
        }
        else if (window.attachEvent) {
            document.attachEvent("onmouseup", function(Event) {
                if (window.event)
                    This.MouseUp(window.event);
                else
                    This.MouseUp(Event);
            });

            document.attachEvent("onmousedown", function(Event) {
                if (window.event)
                    This.MouseDown(window.event);
                else
                    This.MouseDown(Event);
            });

            document.attachEvent("onmousemove", function(Event) {
                if (window.event)
                    This.MouseMove(window.event);
                else
                    This.MouseMove(Event);
            });
        }
    };


    ///-class-/////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////
    Carousel.Content = function(ContentID, Parent, ContentElement) {
        ///-json-//////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////
        if (ContentElement.flickr) {
            var imageSrc = ContentElement.media.m;
            var imageUrl = imageSrc.substr(0, imageSrc.lastIndexOf('.') - 2)
            var imageExt = imageSrc.substr(imageSrc.lastIndexOf('.'));

            var a = document.createElement('a');

            var image = document.createElement('img');
            image.src = imageUrl + '_t' + imageExt;

            a.setAttribute('href', imageUrl + '_b' + imageExt);
            a.setAttribute('type', 'Image');
            a.setAttribute('rel', 'gallery');
            a.setAttribute('title', ContentElement.title);
            if (Carousel.ShowFlickrDesc) {
                a.setAttribute('longdesc', ContentElement.title);
            }
            a.className = 'image';
            a.appendChild(image);

            ContentElement = a;
        }
        else if (ContentElement.youtube) {
            var a = document.createElement('a');

            var image = document.createElement('img');
            image.src = ContentElement.media$group.media$thumbnail[0].url;

            a.setAttribute('href', ContentElement.content.src);
            a.setAttribute('type', 'Video');
            a.setAttribute('rel', 'gallery');
            a.setAttribute('title', ContentElement.title.$t);
            if (Carousel.ShowYouTubeDesc) {
                a.setAttribute('longdesc', ContentElement.media$group.media$description.$t);
            }
            a.className = 'iframe';
            a.appendChild(image);
            ContentElement = a;
        }


        ///-data-//////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////
        var This = this;

        this._ID = ContentID;
        this._parent = Parent;

        this._contentElement = ContentElement;

        this._src = this._contentElement.getElementsByTagName('img')[0].src;

        this._href = this._contentElement.getAttribute('href');

        if (this._href.indexOf('#') > -1)
            this._href = this._href.substr(this._href.indexOf('#'));

        this._elementType = this._contentElement.getAttribute('type');
        this._elementRel = this._contentElement.getAttribute('rel');
        this._elementTitle = this._contentElement.getAttribute('title');
        this._elementLongdesc = (this._contentElement.getAttribute('longdesc') != null) ? this._contentElement.getAttribute('longdesc') : "";

        this._elementClass = this._contentElement.className;

        this._type = Carousel.ContentType.Image;

        if ('Video' == this._elementType)
            this._type = Carousel.ContentType.Video;

        this._loaded = false;
        this._loading = false;

        this._image = null;

        this._naturalSize = { Width: Carousel.LoadingImage.width, Height: Carousel.LoadingImage.height };
        this._displaySize = { Width: Carousel.LoadingImage.width, Height: Carousel.LoadingImage.height };

        this._displayPosition = { X: 0, Y: 0 };


        ///-methods-///////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   GetContentMarkup
        /// Class:  Carousel.Content
        /// Desc:   Builds the content markup
        ///
        ///////////////////////////////////////////////////////////////////////
        this.GetContentMarkup = function() {
            var markup = '<a href="' + this._href + '" type="' + this._elementType + '" class="' + this._elementClass + '" rel="' + this._elementRel + '" title="' + this._elementTitle + '" longdesc="' + this._elementLongdesc + '"><img src="' + this._src + '" alt="" /></a>\n';

            return markup;
        };


        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   Load
        /// Class:  Carousel.Content
        /// Desc:   Loads the image for this content
        ///
        ///////////////////////////////////////////////////////////////////////
        this.Load = function() {
            if (!this._loaded && !this._loading) {
                this._loading = true;

                if (this._image)
                    delete this._image;

                this._image = new Image();
                this._image.onload = function() { This.Onload(); };
                this._image.src = this._src;
            }
        };

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   Onload
        /// Class:  Carousel.Content
        /// Desc:   Load event handler
        ///
        ///////////////////////////////////////////////////////////////////////
        this.Onload = function() {
            this._loaded = true;
            this._loading = false;

            this._naturalSize.Width = this._image.width;
            this._naturalSize.Height = this._image.height;

            this.ScaleToItem(this._parent._itemSize);

            this._parent.ContentLoaded(this);
        };


        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   ScaleToItem
        /// Class:  Carousel.Content
        /// Desc:   Scales the content to its container
        ///
        ///////////////////////////////////////////////////////////////////////
        this.ScaleToItem = function(ItemSize) {
            // calculate scaling
            var sizeDifference =
            {
                Width: this._naturalSize.Width - ItemSize.Width
                , Height: this._naturalSize.Height - ItemSize.Height
            };

            var scalar = 1.0;

            if (sizeDifference.Width > 0 || sizeDifference.Height > 0) {
                if (sizeDifference.Width >= sizeDifference.Height) {
                    // scale height to width
                    this._displaySize.Width = (this._naturalSize.Width - sizeDifference.Width) * scalar;
                    this._displaySize.Height = Math.round(this._naturalSize.Height * (this._displaySize.Width / this._naturalSize.Width));
                }
                else {
                    // scale width to height
                    this._displaySize.Height = (this._naturalSize.Height - sizeDifference.Height) * scalar;
                    this._displaySize.Width = Math.round(this._naturalSize.Width * (this._displaySize.Height / this._naturalSize.Height));
                }
            }
            else {
                this._displaySize.Width = this._naturalSize.Width;
                this._displaySize.Height = this._naturalSize.Height;
            }

            // centre the content
            var bias = { X: 0.0 * scalar, Y: 0.0 * scalar };

            this._displayPosition.X = Math.round(((ItemSize.Width - this._displaySize.Width) + bias.X) / 2.0);
            this._displayPosition.Y = Math.round(((ItemSize.Height - this._displaySize.Height) + bias.Y) / 2.0);
        };

        this.ScaleToItem(this._parent._itemSize);
    };


    ///-class-/////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////
    Carousel.Item = function(ItemID, Parent) {
        ///-data-//////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////
        this._ID = ItemID;
        this._parent = Parent;

        this._position = { X: 0.0, Y: 0.0 };

        this._content = null;
        this._elements = { Container: null, Image: null, Reflection: null };


        ///-methods-///////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   GetElements
        /// Class:  Carousel.Item
        /// Desc:   Attempts to retrieve all DOM elements for this item
        ///
        ///////////////////////////////////////////////////////////////////////
        this.GetElements = function() {
            if (!this._elements.Container)
                this._elements.Container = document.getElementById(this._ID);

            if (!this._elements.Image)
                this._elements.Image = document.getElementById(this._ID + 'Image');

            if (!this._elements.Reflection)
                this._elements.Reflection = document.getElementById(this._ID + 'Reflection');

            return this._elements.Container && this._elements.Image && this._elements.Reflection;
        }

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   GetElement
        /// Class:  Carousel.Item
        /// Desc:   Attempts to retrieve individual DOM element for this item
        ///
        ///////////////////////////////////////////////////////////////////////
        this.GetElement = function(ID) {
            switch (ID) {
                case 'Image':
                    if (!this._elements.Image)
                        this._elements.Image = document.getElementById(this._ID + 'Image');

                    return this._elements.Image;

                case 'Reflection':
                    if (!this._elements.Reflection)
                        this._elements.Reflection = document.getElementById(this._ID + 'Reflection');

                    return this._elements.Reflection;
            }

            if (!this._elements.Container)
                this._elements.Container = document.getElementById(this._ID);

            return this._elements.Container;
        };

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   GetMarkup
        /// Class:  Carousel.Item
        /// Desc:   Builds the markup for this item
        ///
        ///////////////////////////////////////////////////////////////////////
        this.GetMarkup = function() {
            return '<div id="' + this._ID + '" class="" style="position:absolute; right:0px; bottom:0px; width:' + this._parent._itemSize.Width + 'px; height:' + this._parent._itemSize.Height + 'px; z-index:1; overflow:hidden;" onclick="javascript:' + this._parent._ID + '.MoveToItem(\'' + this._ID + '\');">\n'
                 + '<img id="' + this._ID + 'Image" class="imagethumb" style="position:absolute; left:0px; top:0px;" src="' + Carousel.LoadingImage.src + '" width="' + Carousel.LoadingImage.width + '" height="' + Carousel.LoadingImage.width + '" border="0" alt="" />\n'
            //+ '<img id="' + this._ID + 'Reflection" class="imagereflection" style="position:absolute; left:0px; top:0px; -moz-transform:scaleY(-1.5); -webkit-transform:scaleY(-1.5); transform:scaleY(-1.5); -o-transform:scaleY(-1.5); opacity:0.2; filter:flipv progid:DXImageTransform.Microsoft.Alpha(opacity=30, style=1, finishOpacity=0, startx=0, starty=0, finishx=0, finishy=100);" src="' + Carousel.LoadingImage.src + '" width="' + Carousel.LoadingImage.width + '" height="' + Carousel.LoadingImage.height + '" border="0" alt="" />\n'
                 + "<div id=\"" + this._ID + "Reflection\" class=\"imagereflection png\" style=\"position:absolute; display: block; left:0px; top:0px; background: transparent url('/Images/caro_grad_tcm613-1003063.gif') no-repeat center 0px;\" border=\"0\" alt=\"\" ></div>\n"
                 + '</div>\n';
        };

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   DetachElements
        /// Class:  Carousel.Item
        /// Desc:   Deletes the stored references to the DOM elements
        ///
        ///////////////////////////////////////////////////////////////////////
        this.DetachElements = function() {
            this._elements.Container = null;
            this._elements.Image = null;
            this._elements.Reflection = null;
        };

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   ReplaceContent
        /// Class:  Carousel.Item
        /// Desc:   Replaces this item's content
        ///
        ///////////////////////////////////////////////////////////////////////
        this.ReplaceContent = function(Content) {
            this._content = Content;

            if (this.GetElements()) {
                if (this._content) {
                    this._content.ScaleToItem(this._parent._itemSize);

                    if (this._content._loaded)
                        this._elements.Image.src = this._content._src;
                    else
                        this._elements.Image.src = Carousel.LoadingImage.src;

                    if (this._parent._showReflections)
                        this._elements.Reflection.src = this._elements.Image.src;
                }
                else {
                    this._elements.Image.src = '';
                    this._elements.Reflection.src = '';
                }

                this.Redraw();
            }
        };

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   Rotate
        /// Class:  Carousel.Item
        /// Desc:   Rotates this item using values defined by the parent
        ///
        ///////////////////////////////////////////////////////////////////////
        this.Rotate = function() {
            var newX = this._parent._rotate.Cos * this._position.X - this._parent._rotate.Sin * this._position.Y;
            var newY = this._parent._rotate.Sin * this._position.X + this._parent._rotate.Cos * this._position.Y;

            this._position.X = newX;
            this._position.Y = newY;
        };

        ///-method-////////////////////////////////////////////////////////////
        ///
        /// Name:   Redraw
        /// Class:  Carousel.Item
        /// Desc:   Redraws this item's element onscreen
        ///
        ///////////////////////////////////////////////////////////////////////
        this.Redraw = function() {
            var projection = this._parent.ProjectItem(this);

            if (this.GetElements()) {
                // position and dimensions
                this._elements.Container.style.right = projection.X + 'px';
                this._elements.Container.style.bottom = projection.Y + 'px';

                this._elements.Container.style.width = projection.Width + 'px';
                this._elements.Container.style.height = projection.Height + 'px';
                this._elements.Container.style.zIndex = Math.round((this._position.Y + 1.5) * 1000.0);

                // opacity
                var opacity = Math.round((this._position.Y + 0.2) / 1.2 * 100.0) / 100.0;

                this._elements.Container.style.opacity = opacity;

                if (Carousel.IE > 0)
                    this._elements.Container.style.filter = 'alpha(opacity=' + Math.round(opacity * 100.0) + ')';


                if (this._content) {
                    this._elements.Container.style.visibility = 'visible';

                    var ratio =
                    {
                        X: (projection.Width / this._parent._itemSize.Width),
                        Y: (projection.Height / this._parent._itemSize.Height)
                    };

                    var left = Math.round(this._content._displayPosition.X * ratio.X);
                    var top = Math.round(this._content._displayPosition.Y * ratio.Y);
                    var width = Math.round(this._content._displaySize.Width * ratio.X);
                    var height = Math.round(this._content._displaySize.Height * ratio.Y);

                    this._elements.Image.style.left = left + 'px';
                    this._elements.Image.style.top = top + 'px';
                    this._elements.Image.width = width;
                    this._elements.Image.height = height;

                    if (this._parent._showReflections) {
                        this._elements.Reflection.style.visibility = 'visible';

                        this._elements.Reflection.style.left = left + 'px';
                        this._elements.Reflection.style.top = (top + height) + 'px';
                        this._elements.Reflection.style.width = width + 'px';
                        this._elements.Reflection.style.height = (height * 0.3) + 'px';
                    }
                    else {
                        this._elements.Reflection.style.visibility = 'hidden';
                    }
                }
                else {
                    this._elements.Container.style.visibility = 'hidden';
                }
            }
        };
    };


    ///-data-//////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////
    var This = this;

    this._ID = ID;
    this._sourceDivID = SourceDivID;

    this._mouseTracker = new Carousel.MouseTracker();

    this._element = null;

    this._content = { All: [], Active: [] };
    this._contentOffset = 0;
    this._contentTarget = 0;
    this._contentLimit = 0;
    this._contentLocalCount = 0;
    this._contentLoadingCount = 0;

    this._items = [];
    this._itemLimit = { Min: 0.0, Max: 0.0, Range: 0.0 };
    this._itemSize = { Width: 152.0, Height: 120.0 };
    this._itemIncrement = 1;

    this._sliderPosition = 0.0;
    this._sliderSize = { Width: 0.0, Height: 20.0 };

    this._showReflections = true;
	if(!$.support.opacity && !window.XMLHttpRequest) this._showReflections = false;
    this._horizontal = true;

    this._size = { Width: 0.0, Height: 0.0 };

    if (this._horizontal) {
        this._size.Width = 600;
        this._size.Height = this._itemSize.Height + this._sliderSize.Height;
    }
    else {
        this._size.Width = this._itemSize.Width + this._sliderSize.Height;
        this._size.Height = 450;
    }

    this._rotate = { Cos: 0.0, Sin: 0.0 };
    this._velocity = 0.0;

    this._dragCarousel = false;

    this._dock = false;

    this._frameIndex = 0;
    this._frameCount = 10;
    this._frameTime = 0;
    this._frameTimeDifference = 0;

    this._interval = null;
    this._filter = Carousel.ContentType.Image | Carousel.ContentType.Video;


    ///-methods-///////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////

	///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   SetSliderHeight
    /// Class:  Carousel
    /// Desc:   Sets the slider height and resets the global height/width
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.SetSliderHeight = function(Value) {
        this._sliderSize = { Width: 0.0, Height: Value };
		if (this._horizontal) {
			this._size.Width = 600;
			this._size.Height = this._itemSize.Height + this._sliderSize.Height;
		}
		else {
			this._size.Width = this._itemSize.Width + this._sliderSize.Height;
			this._size.Height = 450;
		}
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   GetElement
    /// Class:  Carousel
    /// Desc:   Attempts to retrieve the DOM element for the carousel
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.GetElement = function() {
        if (!this._element)
            this._element = document.getElementById(this._ID);

        return this._element;
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   SetSize
    /// Class:  Carousel
    /// Desc:   Sets the carousel size
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.SetSize = function(Value) {
        if (this._horizontal) {
            this._size.Width = Value;
            this._size.Height = this._itemSize.Height + this._sliderSize.Height;
        }
        else {
            this._size.Width = this._itemSize.Width + this._sliderSize.Height;
            this._size.Height = Value;
        }

        this.Draw();
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   SetShowReflections
    /// Class:  Carousel
    /// Desc:   Sets reflections on/off
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.SetShowReflections = function(Value) {
        if (Value) {
			this._showReflections = true;
			if(!$.support.opacity && !window.XMLHttpRequest) this._showReflections = false;
		}
        else {
            this._showReflections = false;
		}
        this.Draw();
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   SetHorizontal
    /// Class:  Carousel
    /// Desc:   Sets the carousel horizontal or vertical
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.SetHorizontal = function(Value) {
        var size = 0;

        if (this._horizontal)
            size = this._size.Width;
        else
            size = this._size.Height;

        if (Value) {
            this._horizontal = true;

            this._size.Width = size;
            this._size.Height = this._itemSize.Height + this._sliderSize.Height;
        }
        else {
            this._horizontal = false;

            this._size.Width = this._itemSize.Width + this._sliderSize.Height;
            this._size.Height = size;
        }

        this.Draw();
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   SetFilter
    /// Class:  Carousel
    /// Desc:   Sets the content filter flag
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.SetFilter = function(Filter) {
        this.Stop();

        this._filter = Filter;
        this.CallOnFilterWT(Filter);
        this.FilterActiveContent();
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   AddFilter
    /// Class:  Carousel
    /// Desc:   Adds a content filter flag
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.AddFilter = function(Filter) {
        this.Stop();

        this._filter |= Filter;

        this.FilterActiveContent();
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   CallOnFilterWT
    /// Class:  Carousel
    /// Desc:   Calls the dcsTrk method for web trends when enabled
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.CallOnFilterWT = function(filter){
        if (Carousel.FireWebTrendsOnFilter){
            switch(filter){
                 case 1:
                     filter = "Image";
                     break;
                 case 2:
                     filter = "Video";
                     break;
                 case 3:
                     filter = "All";
                     break;
                 default:
                     break;
            }
            dcsTrk('WT.pn=Gallery&WT.ev_act=Filter&WT.ev_val=' + filter);
        }
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   RemoveFilter
    /// Class:  Carousel
    /// Desc:   Removes a content filter flag
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.RemoveFilter = function(Filter) {
        this.Stop();

        this._filter &= ~Filter;

        this.FilterActiveContent();
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   GetContentLimit
    /// Class:  Carousel
    /// Desc:   Calculate the content limit
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.GetContentLimit = function() {
        this._contentLimit = Math.floor(this._content.Active.length / 2.0);
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   GetContentOffset
    /// Class:  Carousel
    /// Desc:   Calculate the content offset
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.GetContentOffset = function() {
        var activeContentCount = 0;

        for (var count = 0; count < this._contentLocalCount; ++count)
            if ((this._filter & this._content.All[count]._type) == this._content.All[count]._type)
            ++activeContentCount;

        //this._contentOffset = this._contentLimit - Math.floor(activeContentCount / 2.0);
        this._contentOffset = this._contentLimit - Math.floor(this._items.length / 2.0);
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   GetContent
    /// Class:  Carousel
    /// Desc:   Attempts to retrieve the DOM content for the carousel
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.GetContent = function(callback) {
        var contentContainer = document.getElementById(this._sourceDivID);

        if (contentContainer) {
            contentContainer.style.display = 'none';

            var content = contentContainer.getElementsByTagName('a');

            for (var count = 0; count < content.length; ++count)
                this.AddContent(content[count]);

            this._contentLocalCount = this._content.All.length;

            this.GetContentLimit();
            this.GetContentOffset();


            // load feeds
            content = document.getElementById('feeds');
            if (content) {
                content = content.getElementsByTagName('li');

                for (var countFeeds = 0; countFeeds < content.length; ++countFeeds) {
                    var url = content[countFeeds].getAttribute('href').replace(/&amp;/gi, '&');
                    var data = url.split('?');
                    url = data[0];
                    data = data[1];

                    var type = content[countFeeds].getAttribute('type').toLowerCase();
                    var showdescription = (content[countFeeds].getAttribute('showdescription').toLowerCase()) == "true" ? true : false;

                    if (type == 'flickr') {
                        data += (bolUsingProxy) ? encodeURIComponent('&format=json&jsoncallback=?') : '&format=json&jsoncallback=?';
                        Carousel.ShowFlickrDesc = (content[countFeeds].getAttribute('showdescription').toLowerCase()) == "true" ? true : false;
                    }
                    else if (type == 'youtube') {
                        data += (bolUsingProxy) ? encodeURIComponent('&v=2&alt=json') : '&rel=0&v=2&alt=json';
                        Carousel.ShowYouTubeDesc = (content[countFeeds].getAttribute('showdescription').toLowerCase()) == "true" ? true : false;
                        //if (window.opera)
                        //    data += (bolUsingProxy) ? encodeURIComponent('-in-script&callback=?') : '-in-script&callback=?';
                    }
                    $.ajax
                    ({
                        type: 'GET',
                        url: url,
                        data: data,
                        cache: false,

                        success: function(Data) {

                            //try
                            //{
                            //if (Carousel.IE > 0 && Carousel.IE < 8)
                            //{
                            //    var whitespace = '\t\r\n ';

                            //    while (whitespace.indexOf(Data[0]) > -1)
                            //        Data = Data.substr(1);

                            //    if (Data.indexOf('(') == 0)
                            //        Data = Data.slice(1, Data.lastIndexOf(')'));


                            //    Data = $.parseJSON(Data);
                            //}

                            if (Data.items) {
                                for (var countItems = 0; countItems < Data.items.length; ++countItems) {
                                    Data.items[countItems].flickr = true;
                                    This.AddContent(Data.items[countItems]);
                                }
                            }
                            else if (Data.feed) {
                                for (var countItems = 0; countItems < Data.feed.entry.length; ++countItems) {
                                    Data.feed.entry[countItems].youtube = true;
                                    This.AddContent(Data.feed.entry[countItems]);
                                }
                            }
                            else {
                                return;
                            }

                            This.GetContentLimit();
                            This.GetContentOffset();

                            This.Draw();
                            //}
                            //catch (e) { alert("catch"); }
	if (callback) callback();
                            return;
                        },
						error:function (xhr, ajaxOptions, thrownError){
							if (callback) callback();							
						}, 
                        dataType: 'json'
                        //dataType:(Carousel.IE > 0 && Carousel.IE < 8 ? 'text' : 'json')
                    });
                }
            }

            this.Draw();
if (!content) if (callback) callback();
        }
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   AddContent
    /// Class:  Carousel
    /// Desc:   Adds new content to the carousel
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.AddContent = function(ContentElement) {
        this._content.All.push(new Carousel.Content(this._ID + 'Content' + this._content.All.length, this, ContentElement));

        if ((this._filter & this._content.All[this._content.All.length - 1]._type) == this._content.All[this._content.All.length - 1]._type) {
            this._content.Active.push(this._content.All[this._content.All.length - 1]);
            this.GetContentLimit();
        }
        ++this._contentLoadingCount;
        this._content.All[this._content.All.length - 1].Load();
        return this._content.All[this._content.All.length - 1];
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   FilterActiveContent
    /// Class:  Carousel
    /// Desc:   Filters the active content
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.FilterActiveContent = function() {
        this._content.Active.splice(0, this._content.Active.length);

        for (var count = 0; count < this._content.All.length; ++count)
            if ((this._filter & this._content.All[count]._type) == this._content.All[count]._type)
            this._content.Active.push(this._content.All[count]);

        this.GetContentLimit();
        this.GetContentOffset();

        this.Draw();
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   ContentLoaded
    /// Class:  Carousel
    /// Desc:   Updates the carousel with the loaded content
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.ContentLoaded = function(Content) {
        --this._contentLoadingCount;

        this.UpdateItemText();

        for (var count = 0; count < this._items.length; ++count) {
            if (this._items[count]._content && this._items[count]._content._ID == Content._ID) {
                this._items[count].ReplaceContent(this._items[count]._content);
                this._items[count].Redraw();
            }
        }
    };


    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   DeleteItem
    /// Class:  Carousel
    /// Desc:   Deletes an item from the carousel
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.DeleteItem = function(Index) {
        if (Index > -1 && Index < this._items.length) {
            if (this.GetElement() && this._items[Index].GetElement())
                this._element.removeChild(this._items[Index]._elements.Container);

            delete this._items[Index];

            this._items.splice(Index, 1);
        }
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   SetItemsOnScreen
    /// Class:  Carousel
    /// Desc:   Sets how many items are displayed onscreen
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.SetItemsOnScreen = function(Value) {
        if (Value > 3) {
            this.Stop();

            while (this._items.length)
                this.DeleteItem(0);

            for (var count = 0; count < Value; ++count)
                this._items.push(new Carousel.Item(this._ID + 'Item' + count, this));

            this._itemLimit.Max = Math.sin(Math.PI / (this._items.length - 1));
            this._itemLimit.Min = -this._itemLimit.Max;
            this._itemLimit.Range = this._itemLimit.Max * 2.0;
        }
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   UpdateVelocity
    /// Class:  Carousel
    /// Desc:   Calculates the velocity based on position, target etc.
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.UpdateVelocity = function(Refresh) {
        var distance = this._contentTarget - this._contentOffset;
        //var velocity = 2.2;
        //var velocityMin = 0.15;
        //var scalar = 0.965;

        var velocity = Carousel.velocity;
        var velocityMin = Carousel.velocityMin;
        var scalar = Carousel.scalar;

        if (distance < 0) {
            if (Refresh)
                this._velocity = -velocity * Math.pow(scalar, (5 + distance) * this._frameCount);
            else if (distance > -5)
                this._velocity *= scalar;
            else
                this._velocity = -velocity;

            if (this._velocity > -velocityMin)
                this._velocity = -velocityMin;
        }
        else if (distance > 0) {
            if (Refresh)
                this._velocity = velocity * Math.pow(scalar, (5 - distance) * this._frameCount);
            else if (distance < 5)
                this._velocity *= scalar;
            else
                this._velocity = velocity;

            if (this._velocity < velocityMin)
                this._velocity = velocityMin;
        }
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   Dock
    /// Class:  Carousel
    /// Desc:   Move to the nearest item
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.Dock = function(Direction) {
        if (this._dock) {
            this._dock = false;

            if (Direction > 0)
                this._velocity = 0.15;
            else
                this._velocity = -0.15;

            this.Start();
        }
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   Rotate
    /// Class:  Carousel
    /// Desc:   Sets the universal angle of rotation
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.Rotate = function(Multiplier) {
        var oneItemAngle = Math.PI / (this._items.length - 1);
        var moveAngle = 0.0;

        if (undefined == Multiplier || null == Multiplier) {
            this.UpdateVelocity();
            moveAngle = (oneItemAngle / this._frameCount) * this._velocity;

            this._itemIncrement = Math.floor(moveAngle / this._itemLimit.Max);

            if (moveAngle < 0 && this._itemIncrement > -1)
                this._itemIncrement = -1;
            else if (moveAngle > 0 && this._itemIncrement < 1)
                this._itemIncrement = 1;
        }
        else
            moveAngle = oneItemAngle * Multiplier;

        this._rotate.Cos = Math.cos(moveAngle);
        this._rotate.Sin = Math.sin(moveAngle);
    };


    ///-user interaction-//////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   MoveItems
    /// Class:  Carousel
    /// Desc:   Move the carousel by n items
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.MoveItems = function(Distance, Velocity) {
        this._frameIndex = 0;

        this._contentTarget = this._contentOffset - Distance;

        var offset = 0;
        if (this._content.Active.length % 2 == 0)
            offset = 1;

        if (this._contentTarget < -this._contentLimit + offset)
            this._contentTarget = -this._contentLimit + offset;
        else if (this._contentTarget > this._contentLimit)
            this._contentTarget = this._contentLimit;

        if (Velocity)
            this._velocity = Velocity;
        else
            this.UpdateVelocity(true);

        if (this._contentTarget != this._contentOffset)
            this.Start();
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   MoveToItem
    /// Class:  Carousel
    /// Desc:   Moves to a item by ID
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.MoveToItem = function(ItemID) {
        var distanceToItem = 0;
        var item = null;

        for (var count = 0; count < this._items.length; ++count) {
            if (this._items[count]._ID == ItemID) {
                distanceToItem = count - Math.floor(this._items.length / 2.0);
                item = this._items[count];
                break;
            }
        }

        if (distanceToItem != 0) {
            this.MoveItems(distanceToItem);
        }
        else if (item) {
            var element = item._content._contentElement;

            if (document.dispatchEvent) {
                var eventObj = document.createEvent('MouseEvents');
                eventObj.initMouseEvent('click', true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, element);
                this.CallWTOnOpen(element.type);
                element.dispatchEvent(eventObj);
            }
            else if (document.fireEvent) {
                this.CallWTOnOpen(element.type);
                element.fireEvent('onclick');
            }
        }
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:  CallWTOnOpen
    /// Class:  Carousel
    /// Desc:   Calls the dcsTrk method for web trends when enabled.
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.CallWTOnOpen = function(type){
        if (Carousel.FireWebTrendsOnOpen)
            dcsTrk('WT.pn=Gallery&WT.ev_act=View&WT.ev_val=' + type);
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   MouseDown
    /// Class:  Carousel
    /// Desc:   Mouse button event handler
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.MouseDown = function(Event, DragCarousel) {
        this.Stop();

        this.MoveSlider();

        if (DragCarousel)
            this._dragCarousel = true;
        else
            this._dragCarousel = false;

        if (window.event && !Event)
            Event = window.event;

        if (Event && Event.preventDefault)
            Event.preventDefault();


        this._mouseTracker.Reset();
        this._mouseTracker.StopSelect();

        //        this._mouseTracker._mouseUp = function() { This.Dock(); This._mouseTracker._mouseMove = null; This._mouseTracker._mouseUp = null; };
        //        this._mouseTracker._mouseMove = function() { This.Drag(); };
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   Drag
    /// Class:  Carousel
    /// Desc:   Drag the carousel with the mouse
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.Drag = function() {
        if (this._mouseTracker._buttonDown && this._content.Active.length > 0) {
            if (!this._dragCarousel) {
                //                this._dock = true;

                //                var targetItem = this._contentOffset + Math.round(this._mouseTracker._acceleration.X / 4.0);

                //                if (targetItem != this._contentOffset)
                //                {
                //                    this.MoveItems(targetItem - this._contentOffset, -Math.round(this._mouseTracker._acceleration.X / 1.0));
                //                    this._mouseTracker.Reset();
                //                }
            }
            else // drag slider
            {
                this._dock = true;

                var positionSpacing = this._size.Width / (this._content.Active.length - 1);
                var newSliderPosition = this._sliderPosition + this._mouseTracker._offset.X;
                var sliderLeftMax = this._size.Width - this._sliderSize.Width;

                if (newSliderPosition < 0.0)
                    newSliderPosition = 0.0;
                else if (newSliderPosition > sliderLeftMax)
                    newSliderPosition = sliderLeftMax;

                if (newSliderPosition != this._sliderPosition) {
                    var scalar = 1.0 - newSliderPosition / sliderLeftMax;
                    var position = Math.ceil(scalar * (this._content.Active.length - 1));

                    this._contentOffset = (position - this._contentLimit);
                    this._contentTarget = this._contentOffset;

                    var sliderCurrentItemOffset = sliderLeftMax - Math.round(position * positionSpacing);
                    var itemDelta = (newSliderPosition - sliderCurrentItemOffset) / positionSpacing;

                    this.UpdateFPSText(itemDelta);

                    ////                    if (this._sliderPosition < newSliderPosition)
                    ////                    {
                    ////                        this.Rotate(-itemDelta);
                    ////                        this._velocity = -1.0;
                    ////                    }
                    ////                    else
                    ////                    {
                    ////                        this.Rotate(itemDelta);
                    ////                        this._velocity = 1.0;
                    ////                    }

                    this._sliderPosition = newSliderPosition;

                    this.PositionSlider();

                    this.Animate(true);
                }

                this._mouseTracker.Reset();
            }
        }
    };


    ///-rendering and animation-///////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   Start
    /// Class:  Carousel
    /// Desc:   Start the carousel animation
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.Start = function() {
        if (null == this._interval) {
            var date = new Date();
            this._frameTime = date.getTime();
            this._frameTimeDifference = 0;
            delete date;

            this.Animate();
        }
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   Stop
    /// Class:  Carousel
    /// Desc:   Start the carousel animation
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.Stop = function() {
        if (null != this._interval) {
            clearTimeout(this._interval);
            this._interval = null;
        }
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   Animate
    /// Class:  Carousel
    /// Desc:   A single animation frame
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.Animate = function(SliderMovement, FreeMovement) {
        if (!SliderMovement)
            this.Rotate();

        this._items[0].Rotate();

        if (!SliderMovement && !FreeMovement &&
            this._contentOffset == this._contentTarget && (
            this._velocity < 0.0 && this._items[0]._position.Y < 0.0 ||
            this._velocity > 0.0 && this._items[0]._position.Y > 0.0)) {
            this.Stop();

            this.PositionItems();
            this.MoveSlider();

            return;
        }

        if (this._velocity < 0.0 && this._items[0]._position.Y < this._itemLimit.Min ||
            this._velocity > 0.0 && this._items[0]._position.Y > this._itemLimit.Max) {
            // move content
            if (FreeMovement) {
                this._contentTarget += this._itemIncrement;

                if (this._contentTarget < -this._contentLimit)
                    this._contentTarget = -this._contentLimit;
                else if (this._contentTarget > this._contentLimit)
                    this._contentTarget = this._contentLimit;
            }

            if (!SliderMovement) {
                this._contentOffset += this._itemIncrement;

                if (this._velocity < 0.0 && this._contentOffset < this._contentTarget ||
                    this._velocity > 0.0 && this._contentOffset > this._contentTarget)
                    this._contentOffset = this._contentTarget;

                this.MoveSlider();
            }

            this.PositionContent();
            this.PositionItems();

            this.UpdateItemText();
        }
        else {
            // move items
            this._items[0].Redraw();

            for (var count = 1; count < this._items.length; ++count) {
                var nextItem = this._items[count];

                nextItem.Rotate();
                nextItem.Redraw();
            }

            // move slider
            if (!SliderMovement) {
                var offset = (this._itemLimit.Max - this._items[0]._position.Y) / this._itemLimit.Range;

                if (this._velocity > 0.0)
                    offset = -(1.0 - offset);

                this.MoveSlider(offset);
            }
        }

        // fps
        var lastTime = this._frameTime;

        var date = new Date();
        this._frameTime = date.getTime();
        delete date;

        this._frameTimeDifference += this._frameTime - lastTime;

        if (this._frameCount == this._frameIndex) {
            var fps = Math.round(1000.0 / (this._frameTimeDifference / this._frameCount));
            this.UpdateFPSText(fps);

            this._frameTimeDifference = 0;

            this._frameIndex = 0;
        }

        ++this._frameIndex;

        // redraw
        if (!SliderMovement && !FreeMovement)
            this._interval = setTimeout(this._ID + '.Animate();', 1);
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   Draw
    /// Class:  Carousel
    /// Desc:   Builds and renders the carousel markup to the screen
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.Draw = function() {
        if (this.GetElement()) {
            var markup = '';

            var contentContainer = document.getElementById(this._sourceDivID);
            if (contentContainer) {
                contentContainer.innerHTML = '';

                markup = '<div class="fancyboxthumbs">\n';

                for (var count = 0; count < this._content.Active.length; ++count)
                    markup += this._content.Active[count].GetContentMarkup();

                markup += '</div>\n';

                contentContainer.innerHTML = markup;

                for (var count = 0; count < this._content.Active.length; ++count)
                    this._content.Active[count]._contentElement = contentContainer.getElementsByTagName('a')[count];

                lx_ol_initGallery('div.fancyboxthumbs a');
            }


            markup = '';

            this._element.innerHTML = '';

            this._element.style.width = Math.round(this._size.Width) + 'px';
            this._element.style.height = Math.round(this._size.Height) + 'px';

            for (var count = 0; count < this._items.length; ++count) {
                this._items[count].DetachElements();
                markup += this._items[count].GetMarkup();
            }

            //markup += '<div id="' + this._ID + 'FPSText" class="" style="position:absolute; bottom:0px; left:0px; text-align:left;"></div>\n';
            markup += '<div id="' + this._ID + 'ItemText" class="" style="position:absolute; bottom:0px; left:10px; text-align:right;"></div>\n';
            //markup += '<div id="' + this._ID + 'Slider" class="" style="position:absolute; left:0px; top:0px; width:1px; height:1px; z-index:2; background-color:#000000;" onmousedown="javascript:' + this._ID + '.MouseDown(event);"><br /></div>\n';

            this._element.innerHTML = markup;
        }
		if (this._content.Active.length<4) {
			this.MoveToItem('carouselItem'+(this._content.Active.length-1));
		}
		else if (this._content.Active.length<7&&this._content.Active.length!=4) {
			this.Dock(1);
		}
        this.PositionContent();
        this.PositionItems();
        this.MoveSlider();

        this.UpdateItemText();
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   UpdateItemText
    /// Class:  Carousel
    /// Desc:   Updates the text indicating the current item
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.UpdateItemText = function() {
        var element = document.getElementById(this._ID + 'ItemText');
        if (element) {
            var index = 0;
            if (this._content.Active.length > 0)
                index = this._contentLimit + 1 - this._contentOffset;
            //element.innerHTML = 'Item ' + index + ' of ' + this._content.Active.length + '<br />' + this._contentLoadingCount + ' Items Loading';
            //if (this._contentLoadingCount > 0) {
            //    element.innerHTML = this._contentLoadingCount + ' Items Loading';
            //}
            //else {
             //   element.innerHTML = '';
            //}
            var htmlContainer = $('#gallery');
            var imageCount = $("a[type='Image']", htmlContainer).length;
            if (imageCount > 0) {
                $('#spnImageCount').html('(' + imageCount + ')');
            }
            var videoCount = $("a[type='Video']", htmlContainer).length;
            if (videoCount > 0) {
                $('#spnVideoCount').html('(' + videoCount + ')');
            }
        }
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   UpdateFPSText
    /// Class:  Carousel
    /// Desc:   Updates the text indicating the frames per seconds
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.UpdateFPSText = function(Value) {
        var element = document.getElementById(this._ID + 'FPSText');
        if (element)
            element.innerHTML = Value + ' FPS';
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   ProjectItem
    /// Class:  Carousel
    /// Desc:   Transforms an item's coordinates from modelspace to screenspace
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.ProjectItem = function(Item) {
        var multiplier = (Item._position.Y + 1.0) / 2.0;
        multiplier = Math.pow(multiplier, 2.0);

        var returnVal =
        {
            X: 0, Y: 0
            , Width: this._itemSize.Width * multiplier
            , Height: this._itemSize.Height * multiplier
        };

        if (returnVal.Width < 1)
            returnVal.Width = 1;

        if (returnVal.Height < 1)
            returnVal.Height = 1;


        if (this._horizontal) {
            var itemOffsetX = (this._size.Width - returnVal.Width) / 2.0;
            var itemOffsetY = (this._itemSize.Height - returnVal.Height) / 2.0;

            returnVal.X = Math.round(Item._position.X * itemOffsetX + itemOffsetX);
            returnVal.Y = Math.round(itemOffsetY + this._sliderSize.Height);
        }
        else {
            var itemOffsetX = (this._itemSize.Width - returnVal.Width) / 2.0;
            var itemOffsetY = (this._size.Height - returnVal.Height) / 2.0;

            returnVal.X = Math.round(itemOffsetX + this._sliderSize.Height);
            returnVal.Y = Math.round(Item._position.X * itemOffsetY + itemOffsetY);
        }


        return returnVal;
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   PositionContent
    /// Class:  Carousel
    /// Desc:   Places the content in the correct items
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.PositionContent = function() {
        var deltaItemsContent = Math.floor((this._items.length - this._content.Active.length) / 2.0);
        var startItemIndex = deltaItemsContent + this._contentOffset;
        var startContentIndex = (startItemIndex < 0 ? -startItemIndex : 0);

        if (startItemIndex < 0)
            startItemIndex = 0;

        for (var count = 0; count < this._items.length; ++count) {
            var nextContentIndex = startContentIndex + (count - startItemIndex);
            var content = (count >= startItemIndex && nextContentIndex > -1 && nextContentIndex < this._content.Active.length ? this._content.Active[nextContentIndex] : null);

            if (content)
                content._element = null;

            this._items[count].ReplaceContent(content);
        }
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   PositionItems
    /// Class:  Carousel
    /// Desc:   Places the items around the carousel
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.PositionItems = function() {
        for (var count = 0; count < this._items.length; ++count) {
            var nextItem = this._items[count];

            this.Rotate(count);

            nextItem._position.X = 1.0;
            nextItem._position.Y = 0.0;

            nextItem.Rotate();
            nextItem.Redraw();
        }
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   MoveSlider
    /// Class:  Carousel
    /// Desc:   Moves the slider according to the content offset
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.MoveSlider = function(Offset) {
        Offset = 0;

        var element = document.getElementById(this._ID + 'Slider');

        if (element) {
            if (this._content.Active.length > 0) {
                if (this._horizontal) {
                    var position = this._contentLimit - this._contentOffset;
                    var positionSpacing = this._size.Width / (this._content.Active.length - 1);
                    var scalar = position / (this._content.Active.length - 1);

                    this._sliderSize.Width = Math.max(positionSpacing, 10);
                    this._sliderPosition = position * positionSpacing - scalar * this._sliderSize.Width;

                    if (Offset)
                        Offset *= positionSpacing;
                    else
                        Offset = 0;

                    element.style.left = Math.round(this._sliderPosition + Offset) + 'px';
                    element.style.top = Math.round(this._itemSize.Height) + 'px';
                    element.style.width = Math.round(this._sliderSize.Width) + 'px';
                    element.style.height = Math.round(this._sliderSize.Height) + 'px';
                }
                else {
                    this._sliderPosition = this._size.Height / this._content.Active.length * (this._contentLimit - this._contentOffset);
                    this._sliderSize.Width = Math.max(this._size.Height / this._content.Active.length, 10);

                    if (Offset)
                        Offset *= this._size.Height / this._content.Active.length;
                    else
                        Offset = 0;

                    element.style.left = Math.round(this._itemSize.Width) + 'px';
                    element.style.top = Math.round(this._sliderPosition + Offset) + 'px';
                    element.style.width = Math.round(this._sliderSize.Height) + 'px';
                    element.style.height = Math.round(this._sliderSize.Width) + 'px';
                }

                element.style.visibility = 'visible';
            }
            else {
                element.style.visibility = 'hidden';
            }
        }
    };

    ///-method-////////////////////////////////////////////////////////////////
    ///
    /// Name:   PositionSlider
    /// Class:  Carousel
    /// Desc:   Positions the slider DOM element
    ///
    ///////////////////////////////////////////////////////////////////////////
    this.PositionSlider = function() {
        var element = document.getElementById(this._ID + 'Slider');

        if (element) {
            if (this._horizontal)
                element.style.left = Math.round(this._sliderPosition) + 'px';
            else
                element.style.top = Math.round(this._sliderPosition) + 'px';
        }
    };


    ///-initialisation-////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////

    this.SetItemsOnScreen(7);

    var galleyControls = $('#gallerycontrols li a');
    galleyControls.bind("click", function(evt) {
        evt.preventDefault();
        galleyControls.removeClass('on');
        $(this).addClass('on');
        switch (this.id) {
            case 'btnClearFilter':
                carousel.SetFilter(Carousel.ContentType.Image | Carousel.ContentType.Video);
                break;
            case 'btnImageFilter':
                carousel.SetFilter(Carousel.ContentType.Image);
                break;
            case 'btnVideoFilter':
                carousel.SetFilter(Carousel.ContentType.Video);
                break;
        }
    });
}
function getQuerystringCarousel(key, default_) {
    if (default_ == null) default_ = "";
    key = key.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regex = new RegExp("[\\?&]" + key + "=([^&#]*)");
    var qs = regex.exec(window.location.href);
    if (qs == null)
        return default_;
    else
        return qs[1];
}
(function($){
		
		var keyString = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
		
		var uTF8Encode = function(string) {
			string = string.replace(/\x0d\x0a/g, "\x0a");
			var output = "";
			for (var n = 0; n < string.length; n++) {
				var c = string.charCodeAt(n);
				if (c < 128) {
					output += String.fromCharCode(c);
				} else if ((c > 127) && (c < 2048)) {
					output += String.fromCharCode((c >> 6) | 192);
					output += String.fromCharCode((c & 63) | 128);
				} else {
					output += String.fromCharCode((c >> 12) | 224);
					output += String.fromCharCode(((c >> 6) & 63) | 128);
					output += String.fromCharCode((c & 63) | 128);
				}
			}
			return output;
		};
		
		var uTF8Decode = function(input) {
			var string = "";
			var i = 0;
			var c = c1 = c2 = 0;
			while ( i < input.length ) {
				c = input.charCodeAt(i);
				if (c < 128) {
					string += String.fromCharCode(c);
					i++;
				} else if ((c > 191) && (c < 224)) {
					c2 = input.charCodeAt(i+1);
					string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
					i += 2;
				} else {
					c2 = input.charCodeAt(i+1);
					c3 = input.charCodeAt(i+2);
					string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
					i += 3;
				}
			}
			return string;
		}
		
		$.extend({
			base64Encode: function(input) {
				var output = "";
				var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
				var i = 0;
				input = uTF8Encode(input);
				while (i < input.length) {
					chr1 = input.charCodeAt(i++);
					chr2 = input.charCodeAt(i++);
					chr3 = input.charCodeAt(i++);
					enc1 = chr1 >> 2;
					enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
					enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
					enc4 = chr3 & 63;
					if (isNaN(chr2)) {
						enc3 = enc4 = 64;
					} else if (isNaN(chr3)) {
						enc4 = 64;
					}
					output = output + keyString.charAt(enc1) + keyString.charAt(enc2) + keyString.charAt(enc3) + keyString.charAt(enc4);
				}
				return output;
			},
			base64Decode: function(input) {
				var output = "";
				var chr1, chr2, chr3;
				var enc1, enc2, enc3, enc4;
				var i = 0;
				input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
				while (i < input.length) {
					enc1 = keyString.indexOf(input.charAt(i++));
					enc2 = keyString.indexOf(input.charAt(i++));
					enc3 = keyString.indexOf(input.charAt(i++));
					enc4 = keyString.indexOf(input.charAt(i++));
					chr1 = (enc1 << 2) | (enc2 >> 4);
					chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
					chr3 = ((enc3 & 3) << 6) | enc4;
					output = output + String.fromCharCode(chr1);
					if (enc3 != 64) {
						output = output + String.fromCharCode(chr2);
					}
					if (enc4 != 64) {
						output = output + String.fromCharCode(chr3);
					}
				}
				output = uTF8Decode(output);
				return output;
			}
		});
	})(jQuery);


/*!
 * whitelist.js
 *
 * usage: $.whitelist(URL);
 *
 * description: takes an input URL and parses it to get the domain, then checks if this domain
 *              is in the whitelist and returns true or false
 */
(function($) {

    var settings = {
        whitelistGlobal : $.base64Decode("bGV4dXMuYXQsbGV4dXMuYmUsbGV4dXMtYnVsZ2FyaWEuYmcsbGV4dXMtZXVyb3BlLmNvbSxsZXh1cy5jb20uaHIsbGV4dXMuY3osbGV4dXMuZGssbGV4dXMuZWUsbGV4dXMuZmksbGV4dXMuZnIsbGV4dXMuZGUsbGV4dXMuY28udWssbGV4dXMuZ3IsbGV4dXMuaHIsbGV4dXMuaXMsbGV4dXMuaWUsbGV4dXMuY28uaWwsbGV4dXMuaXQsbGV4dXMubHYsbGV4dXMubHUsbGV4dXMubmwsbGV4dXMtcG9sc2thLnBsLGxleHVzLnB0LGxleHVzLXJ1c3NpYS5ydSxsZXh1cy5zaSxtdW5kb2xleHVzLmNvbSxsZXh1cy5zZSxsZXh1cy5jaCxsZXh1cy5ubyxsZXh1cy51YSxsZXh1cy5zayxsZXh1cy5ycyxsZXh1cy5ybyxsZXh1cy5jYSxsZXh1cy5jb20sZGUubGV4dXMuY2gsaXQubGV4dXMuY2gsZnIubGV4dXMuY2gsZWUubGV4dXMuZWUscnUubGV4dXMuZWUsbHQubGV4dXMubHQscnUubGV4dXMubHQsbHYubGV4dXMubHYscnUubGV4dXMubHYsODMuMTY0LjEzMi42MixhbWF6ZS5jb20sbG9jYWxob3N0LDEyNy4wLjAuMSx0b3lvdGEtZXVyb3BlLmNvbSx0b3lvdGEtbW90b3ItZXVyb3BlLmNvbSxsZXh1cy1ldXJvcGUuY29tLGxleHVzLmV1LHRveW90YWFkcmlhLmNvbSwxOTQuMTU3LjIyMS4xNSx0b3lvdGEuY29tLHNlcnZvbGV4dXMuY29tLGxleHVzYnJhc2lsLmNvbSxnYXJhZ2Vjb3JkaWEuY29tLGxleHVzLmNvLnphLGxleHVzLmNvbS5hdSxsZXh1cy5jby5ueixsZXh1cy5jb20uYm4sbGV4dXMuY29tLmNuLGFrZ3VhbS5jb20sbGV4dXMuY29tLmhrLGxleHVzLmpwLGxleHVzLmNvLmtyLGFsc2F5ZXJvbmxpbmUuY29tLGxleHVzb21hbi5jb20sbGV4dXMuY29tLnNhLGxleHVzLmNvbS5zZyxsZXh1cy5jb20udHcsbGV4dXMuY29tLnRoLGxleHVzdWFlLmNvbSxsZXh1cy5jb20uYmgsdG95b3RhbGViYW5vbi5jb20sbGV4dXMuY29tLm15LGxleHVzLmNvbS5pZCxsZXh1cy5jb20ucGgsbGV4dXNmb3J1bS1rb2Vsbi5kZSxsZXh1c2ZvcnVtLW51ZXJuYnVyZy5kZSxsZXh1c2ZvcnVtLWJpZWxlZmVsZC5kZSxsZXh1c2ZvcnVtLWJlcmxpbi16ZW50cnVtLmRlLGxleHVzZm9ydW0taGFtYnVyZy1jZW50cnVtLmRlLGxleHVzZm9ydW0tZHJlc2Rlbi5kZSxsZXh1c2ZvcnVtLW11ZWhsZG9yZi5kZSxsZXh1c2ZvcnVtLWFhY2hlbi5kZSxsZXh1c2ZvcnVtLWxlaXB6aWcuZGUsbGV4dXNmb3J1bS1icmVtZW4uZGUsbGV4dXNmb3J1bS1tb2VuY2hlbmdsYWRiYWNoLmRlLGxleHVzZm9ydW0td2VzZWwuZGUsbGV4dXNmb3J1bS1tdWVuY2hlbi5kZSxsZXh1c2ZvcnVtLWhhbW0uZGUsbGV4dXNmb3J1bS1rYXJsc3J1aGUuY29tLGxleHVzZm9ydW0tc3R1dHRnYXJ0LmRlLGxleHVzZm9ydW0tbGltYnVyZy5kZSxsZXh1c2ZvcnVtLWR1ZXNzZWxkb3JmLmRlLGxleHVzZm9ydW0td3VwcGVydGFsLmRlLGxleHVzZm9ydW0ta2llbC5kZSxsZXh1c2ZvcnVtLXdpZXNiYWRlbi5kZSxsZXh1c2ZvcnVtLWZpbGRlc3RhZHQuZGUsbGV4dXMtbGZhLmNvbSxsZXh1cy1oYWxsLXZpZW5uYS5hdCxsZXh1cy13aWVuLW5vcmQuYXQsbGV4dXMtc2VydmljZS1jbGluaWMuYXQsbGV4dXMtZ3Jhei5hdCxsZXh1cy1pbm5zYnJ1Y2suYXQsbGV4dXMtcmFua3dlaWwuYXQsbGV4dXMuZGV2ZWwucnNpLnBsLGxleHVzZW50aHVzaWFzdC5jb20sbW9uZGlhbGF1dG9tb2JpbGUuY29tLG9yZzQuYml6LGNhcjR5b3UuYXQsdmxhYW1zb3BlcmEuYmUsY3NpZXN0b3JpbC5jb20sZ2xvYmFsY2hhbXBpb25zdG91ci5jb20sbm92ZW1iZXJib3JuLm5ldCxmZWJlbGF1dG8uYmUsc2VydmluZy1zeXMuY29tLGVtZGlhdGUuZGssbW9kaXguZGUsdXNlZGNhcnMuYmcsbGV4dXMtbGVhc2luZy5jaCxsZXh1cy1pbmRvbmVzaWEuY29tLHRveW90YS5jby5qcCx0b3lvdGEtbWVkaWEuY3osdG95b3Rhc3VzaG8uY3osdG95b3RhLmN6LHRveW90YS1tZWRpYS5zayx0b3lvdGEuc2ssdG95b3RhbWFya2V0aW5nLmRrLHRveW90YS5tdWx0aWVkaXRpb24uZmksbGV4dXNwcml2aWxlZ2VwbHVzLmNvbSxsZXh1cy1wcmVmZXJlbmNlLXBsdXMubmV0LHRveW90YS5mcixsZXh1cy5zb2x1dGlvbi53ZWJvcmFtYS5mcixsZXh1cy10ZWNoLmV1LGxleHVzYnVkYS5odSxsZXh1c3Blc3QuaHUsbGV4dXNrb3ZhY3MuaHUsbGV4dXMtdmlsbml1cy5sdCxsZXh1cy1uZXQubmV0LGxleHVzLW1lZGlhLmNvbSx0b3lvdGEucHQsbGV4dXMtbWFwdXBkYXRlcy5ldSxsZXh1cy1uZW9jb3V0dXJlLnJ1MjQtMjYsbGV4dXMtZXhwZXJpZW5jZXMuY28udWssbnVldm9sZXh1c2N0MjAwaC5jb20sYWNjZXB0YW5jZTAwNC50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMDA1LnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UwMDYudG95b3RhLWV1cm9wZS5jb20sYWNjZXB0YW5jZTAwNy50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMDA5LnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UwMTAudG95b3RhLWV1cm9wZS5jb20sYWNjZXB0YW5jZTAxMS50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMDEyLnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UwMTMudG95b3RhLWV1cm9wZS5jb20sYWNjZXB0YW5jZTAxNC50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMDE1LnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UwMTYudG95b3RhLWV1cm9wZS5jb20sYWNjZXB0YW5jZTAxNy50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMDE4LnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UwMTkudG95b3RhLWV1cm9wZS5jb20sYWNjZXB0YW5jZTAyMC50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMDIxLnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UwMjIudG95b3RhLWV1cm9wZS5jb20sYWNjZXB0YW5jZTAyMy50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMDI0LnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UwMjUudG95b3RhLWV1cm9wZS5jb20sYWNjZXB0YW5jZTAyNi50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMDI4LnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UwMzEudG95b3RhLWV1cm9wZS5jb20sYWNjZXB0YW5jZTA1MC50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMDk5LnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UxMDAudG95b3RhLWV1cm9wZS5jb20sYWNjZXB0YW5jZTEwMS50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMTAyLnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UxMDMudG95b3RhLWV1cm9wZS5jb20sYWNjZXB0YW5jZTEwNC50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMTA1LnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UxMDYudG95b3RhLWV1cm9wZS5jb20sYWNjZXB0YW5jZTEwNy50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMTA4LnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UxMDkudG95b3RhLWV1cm9wZS5jb20sYWNjZXB0YW5jZTExMC50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMTExLnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UxMTIudG95b3RhLWV1cm9wZS5jb20sYWNjZXB0YW5jZTExMy50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMTE0LnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UxMTUudG95b3RhLWV1cm9wZS5jb20sYWNjZXB0YW5jZTExNi50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMTE3LnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UxMTgudG95b3RhLWV1cm9wZS5jb20sYWNjZXB0YW5jZTExOS50b3lvdGEtZXVyb3BlLmNvbSxhY2NlcHRhbmNlMTIwLnRveW90YS1ldXJvcGUuY29tLGFjY2VwdGFuY2UxMjEudG95b3RhLWV1cm9wZS5jb20scHJldmlldzAwNC5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MDA1LnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcwMDYuc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzAwNy5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MDA5LnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcwMTAuc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzAxMS5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MDEyLnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcwMTMuc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzAxNC5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MDE1LnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcwMTYuc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzAxNy5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MDE4LnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcwMTkuc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzAyMC5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MDIxLnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcwMjIuc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzAyMy5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MDI0LnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcwMjYuc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzAyOC5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MDMxLnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcwNDAuc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzA0MS5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MDQyLnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcwNTAuc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzA3NC5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MDg2LnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcwOTkuc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzEwMC5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MTAxLnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcxMDIuc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzEwMy5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MTA0LnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcxMDUuc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzEwNi5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MTA3LnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcxMDguc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzEwOS5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MTEwLnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcxMTEuc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzExMi5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MTEzLnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcxMTYuc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzExNy5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbSxwcmV2aWV3MTE5LnNpdGVidWlsZGVyLnRveW90YS1ldXJvcGUuY29tLHByZXZpZXcxMjAuc2l0ZWJ1aWxkZXIudG95b3RhLWV1cm9wZS5jb20scHJldmlldzEyMS5zaXRlYnVpbGRlci50b3lvdGEtZXVyb3BlLmNvbQ=="),
        whitelistLocal : $.base64Decode("bGV4dXMuZXhhbXBsZQ=="),

        fullpath  : "http://www.",
        httppath  : "http://",
        shortpath : "www."
    };

    function stripQueryString(input){
        // remove querystring
        if (input != undefined && input.indexOf('?') != -1){
            input = input.split('?')[0];
        }
        return input;
    };
    
    function stripPath(input){
        // remove path
        if (input != undefined && input.indexOf('/') != -1){
            input = input.split('/')[0];
        }
        return input;
    };

    $.whitelist = function(input) {
        // parse the input and see if its in the whitelist
        var output;
        if (input.indexOf(settings.fullpath)!= -1){
            // remove the 'http://www.'
            output = input.substring(settings.fullpath.length, input.length);
        } else if (input.indexOf(settings.httppath) != - 1){
            // remove the 'http://'
            output = input.substring(settings.httppath.length, input.length);
        } 
        else if (input.indexOf(settings.shortpath) != - 1){
            // remove the 'www.'
            output = input.substring(settings.shortpath.length, input.length);
        } else {
            output = input;
        }
        
        // strip path and query string
        output = stripQueryString(output);
        output = stripPath(output);
            
        // if after stripping the path and querystring there is nothing left,
        // or it is not a domain (i.e contains no dots)
        // then it must have been a relative path so use the current domain
        if (output.length === 0 || output.indexOf(".") === -1){
            output = window.location.host;

            if (output.indexOf(settings.shortpath) != - 1){
            // remove the 'www.'
            output = output.substring(settings.shortpath.length, output.length);
            }

        }

        // Combined the global and local whitelist
        var whitelist = settings.whitelistGlobal + "," + settings.whitelistLocal;
                
        // split the whitelist into an array
        whitelist = whitelist.split(',');
        
        // see if the output is in the whitelist
        if ($.inArray(output, whitelist) != -1){
            return true;
        } else {
            return false;
        }
    };
})(jQuery);
