(function($) {

	if (typeof (Array.prototype.indexOf) == 'undefined') {
		Array.prototype.indexOf = function(item) {
			for ( var i = 0; i < this.length; i++) {
				if (this[i] == item)
					return i;
			}
			return -1;
		}
	}
	String.prototype.splitUrls = function() {
		var urls = this.split(',http');
		for ( var i = 0; i < urls.length; i++) {
			if (i > 0)
				urls[i] = 'http' + urls[i];
		}
		return urls;
	}
	var debug = false;
	jQuery.fn.log = function(msg) {
		if (debug && console)
			console.log("%s: %o", msg, this);
		return this;
	};

	jQuery.fn.extend( {
		executeOnce : function(label, delay, fn, option) {
			return this.each(function() {
				jQuery.timer.delayExecute(this, delay, label, fn, option);
			});
		},
		stopExecution : function(label) {
			return this.each(function() {
				jQuery.timer.remove(this, label);
			});
		}
	});

	jQuery.extend( {
		timer : {
			delayExecute : function(element, delay, label, fn, option) {
				var timer = jQuery.data(element, label);
				if (timer) {
					if (timer.timerId) {
						if (option == 'block')
							return;
						window.clearTimeout(timer.timerId);
						timer.timerId = null;
					}
				} else {
					timer = {};
					jQuery.data(element, label, timer);
				}
				var timerId;
				var handler = function() {
					if (timer.timerId == timerId) {
						timer.timerId = null;
						fn.call(element);
					} else {
					}
				};
				timerId = timer.timerId = window.setTimeout(handler, delay);

			},
			remove : function(element, label) {
				var timer = jQuery.data(element, label);
				if (timer) {
					if (timer.timerId) {
						window.clearTimeout(timer.timerId);
						timer.timerId = null;
					}
				}
			}
		}
	});

	$.fn.document = function() {
		var element = this[0];
		if (element.nodeName.toLowerCase() == 'iframe')
			return element.contentWindow.document;
		else
			return $(this);
	};
	
  	var getTransparent = function(el){
  		for(var n=0;n<el.parents().length;n++){
			var parent = el.parents().get(n);
			var pBg = $.browser.safari ? $(parent).css("background") : $(parent).css("background-color");
			if(pBg!='' && pBg!='transparent'){
				return pBg;
			}
		}
		return '#FFF';
  	}

	$.fn.hoverClass = function(clsName) {
		this.bind('mouseover',function(e){$(this).addClass(clsName);}).bind('mouseout',function(e){$(this).removeClass(clsName);});
        return this;
	};
	var fadeFx = function( opts) {
		opts.showAnim	   = { opacity: 1 };
		opts.hideAnim   = { opacity: 0 };
		opts.cssBeforeShow = { opacity: 0,display:''};
		opts.cssAfterShow = { opacity:''};

        if ( opts.hideSpeed == 0 ) opts.hideSpeed = 50;
	    if ( opts.showSpeed == 0 ) opts.showSpeed = 50;
		opts.sync=false;
		opts.beforeHide.push(function(toHide){
		    var offset = toHide.position();
			this.cssBeforeHide = {top:offset.top + 'px',left:offset.left + 'px',opacity:1,zIndex:100000,position:'absolute'}; 
			this.cssAfterHide = {position:'',top:'',left:'',opacity:'',zIndex : '',display:'none'};
		})
		opts.beforeShow.push(function(toShow){
		    var h = toShow.outerHeight();
		    var w = toShow.outerWidth();
		    var ph = toShow.parent().outerHeight();
		    var pw = toShow.parent().outerWidth();
		    var y = (ph-h)/2;
			var x = (pw-w)/2;
 			var offset = this.jqContentContainer.position();
            toShow.css({position:'absolute',top: (offset.top + y) + 'px',left: (offset.left + x) + 'px'});
		});
		opts.cssAfterShow = {zIndex:'',position : '',left:'',top:'',textAlign:'center',verticalAlign:'middle'};
		opts.cssAfterShow = {zIndex:''};

	};

	var vScrollFx = function( opts) {
		opts.hideAnim   = { height: 'hide' };
		opts.showAnim = { height: 'show' };
		opts.cssAfterShow = { display: '',top:'0px'}
		opts.hideSpeed = 1300;
	    opts.showSpeed = 1300;
	};

	var tossFx = function(opts) {
		if (opts.xOffset == 0 )
			opts.xOffset = 100;
		if ( opts.yOffset == 0 )
			opts.yOffset = 50;
		opts.beforeHide.push(function(toHide){
		    var offset = toHide.position();
			var color = getTransparent(toHide);
			this.cssBeforeHide = {top:offset.top + 'px',left:offset.left + 'px',opacity:1,zIndex:100000,backgroundColor:color,position:'absolute'};
			
			this.cssAfterHide = {position:'',top:0,left:0,opacity:'',zIndex : '',display:'none'};
			this.cssBeforeShow = {opacity:0,zInex:990000,display:''};//,verticalAlign: 'middle'};//top:'',left:'',position:'static'};
			this.cssAfterShow = {opacity:'',zIndex:''};
			this.hideAnim = {left: (offset.left + this.xOffset) + 'px', top: (offset.top - this.yOffset) + 'px',opacity:0};

		});
		if ( this.removeAfterHide ) {
			opts.afterHide.push(function(toHide){toHide.remove();});
		}
		if ($.browser.msie) { 
			opts.beforeShow.push(function(toShow){
		    	if ( this.dynamicLoad && toShow[0].tagName == 'IMG' && this.center ) {
		        	var h = toShow.outerHeight();
		        	var ph = toShow.parent().outerHeight();
					var m = (ph-h)/2;
					if ( m > 0 ) toShow.css('marginTop', m + 'px');
		    	}
			});
        }
		opts.showAnim = { opacity:1 };
		opts.sync = true;
		opts.hideSpeed = 1200;
		opts.showSpeed = 500;
	};

	var zoomFx = function(opts) {
		opts.beforeHide.push(function(toHide){
			var pw = toHide.parent().outerWidth();
			var ph = toHide.parent().outerHeight();
			var w = toHide.outerWidth();
			var h = toHide.outerHeight();
			var x = (pw-w)/2;
			var y = (ph-h)/2;
		    var offset = toHide.position();
			var color = getTransparent(toHide);
			this.cssBeforeHide = {top:offset.top + 'px',left:offset.left + 'px',width:w + 'px',height: h + 'px',opacity:1,zIndex:100000,backgroundColor:color,position:'absolute'};
			this.jqContentContainer.css('display','block');
			offset = this.jqHideTarget.position();

			this.hideAnim={width:this.jqHideTarget.outerWidth() + 'px',height:this.jqHideTarget.outerHeight() + 'px',top:offset.top + 'px',left: offset.left + 'px'};

		});
		if ( this.removeAfterHide ) {
			opts.afterHide.push(function(toHide){toHide.remove();});
		}
		opts.beforeShow.push(function(toShow){
		    var offset = this.jqShowSrc.position();
			var ws = this.jqShowSrc.outerWidth();
			var hs = this.jqShowSrc.outerHeight();
			var pw = this.jqContentContainer.outerWidth();
			var ph = this.jqContentContainer.outerHeight();
			var w = toShow.outerWidth();
			var h = toShow.outerHeight();
			var x = (pw-w)/2;
			var y = (ph-h)/2;
			var color = getTransparent(toShow);
			this.cssBeforeShow = {top:offset.top + 'px',left:offset.left + 'px',width:ws + 'px',height: hs + 'px',opacity:1,zIndex:100000,backgroundColor:color,position:'absolute'};
			var parent = this.jqContentContainer;
			offset = this.jqContentContainer.position();
			this.showAnim = { width: w + 'px',height: h + 'px',left: (offset.left + x)+ 'px',top: (offset.top + y)+ 'px'};

		});

		opts.cssAfterShow = {zIndex:'',position : '',left:'',top:'',textAlign:'center'};
		opts.cssAfterShow = {zIndex:''};
		opts.sync = true;
		if ( opts.hideSpeed == 0 ) opts.hideSpeed = 200;
		if ( opts.showSpeed == 0 ) opts.showSpeed = 200;
	};

	var zoomxFx = function(opts) {
		opts.beforeHide.push(function(toHide){
			var pw = toHide.parent().outerWidth();
			var ph = toHide.parent().outerHeight();
			var w = toHide.outerWidth();
			var h = toHide.outerHeight();
			var x = (pw-w)/2;
			var y = (ph-h)/2;
			this.cssBeforeHide = {};
			this.hideAnim={width:'hide'};
			//if ($.browser.msie) { 
		    	//if ( this.dynamicLoad && toHide[0].tagName == 'IMG' && this.center ) {
		    	if ( this.center ) {
		        	var h = toHide.outerHeight();
		        	var ph = toHide.parent().outerHeight();
					var m = (ph-h)/2;
					if ( m > 0 ) toHide.css('marginTop', m + 'px');
		    	}
        	//}

		});
		if ( this.removeAfterHide ) {
			opts.afterHide.push(function(toHide){toHide.remove();});
		}
		opts.beforeShow.push(function(toShow){
			var pw = toShow.parent().outerWidth();
			var ph = toShow.parent().outerHeight();
			var w = toShow.outerWidth();
			var h = toShow.outerHeight();
			var x = (pw-w)/2;
			var y = (ph-h)/2;
			this.cssBeforeShow = {};
			this.showAnim = { width:'show'};
			//if ($.browser.msie) { 
		    	//if ( this.dynamicLoad && toShow[0].tagName == 'IMG' && this.center ) {
		    	if ( this.center ) {
		        	var h = toShow.outerHeight();
		        	var ph = toShow.parent().outerHeight();
					var m = (ph-h)/2;
					if ( m > 0 )
                		toShow.css('marginTop', m + 'px');
		    	}
        	//}

		});

		//opts.sync = true;
		opts.hideSpeed = 800;
		opts.showSpeed = 1200;
	};
	
	var shuffleFx = function(opts) {
		opts.beforeHide.push(function(toHide){
			var w = toHide.parent().outerWidth();
			var offset = toHide.position();
			var offset2 = toHide.parent().position();
			var color = getTransparent(toHide);
			//toHide.css('background-color', color);
			this.cssBeforeHide = {top:offset.top + 'px',left:offset.left + 'px',zIndex:800000,position:'absolute',backgroundColor:color};
			this.cssAfterHide = {top:'',left:''};//,zIndex :'',position:''};//,opacity:''};
			this.hideAnim = {left: '-=' + (w+this.xOffset) + 'px',top:'-=' + this.yOffset + 'px'};//,opacity:.4};
			this.hideAnim2 = {left: '+=' + (w+this.xOffset) + 'px',top:'+=' + this.yOffset + 'px'};//,opacity:0};

			this.cssBeforeShow = {zIndex:990000,opacity:0,position:'absolute',backgroundColor:color};
			this.cssAfterShow = {zIndex: ''};
			this.showAnim = {opacity:1};

		});
		opts.doHideAnimate = function(jqToHide,jqToShow) {
			var mgr = this;
			jqToHide.animate(this.hideAnim, this.hideSpeed).animate(mgr.hideAnim2, mgr.hideSpeed, function() { //
					jqToHide.hide();
					mgr.doAfterHide(jqToHide);
            });
			this.doShow(jqToShow);
		}

		opts.beforeShow.push(function(toShow){
			
			var pw = toShow.parent().outerWidth();
			var ph = toShow.parent().outerHeight();
			var w = toShow.outerWidth();
			var h = toShow.outerHeight();
			var x = (pw-w)/2;
			var y = (ph-h)/2;
			this.cssBeforeShow = {};
			if ($.browser.msie) { 
		    	if ( this.center ) {
		        	var h = toShow.outerHeight();
		        	var ph = toShow.parent().outerHeight();
					var m = (ph-h)/2;
					if ( m > 0 )
                		toShow.css('marginTop', m + 'px');
		    	}
        	}

		});

		opts.sync = true;
		opts.hideSpeed = 500;
		opts.showSpeed = 100;

	};
	var replaceImage = function (jqToHide,jqToShow) {
		this.doBeforeHide(jqToHide);
		this.doAfterHide(jqToHide);
		jqToHide.attr('src',jqToShow.attr('src'));
		this.doAfterShow(jqToHide);
	}
	var replaceContent = function (jqToHide,jqToShow) {
		this.doBeforeHide(jqToHide);
		jqToHide.hide();
		this.doAfterHide(jqToHide);
		jqToShow.show();			  
		this.doAfterShow(jqToShow);

	}
		
	var defaultDisplayMgr = {
	    fx:'',
		hideAnim: null,
	    hideSpeed: 0,
		cssBeforeHide : {},
		cssAfterHide : {},
		beforeHide : [],
		afterHide : [],
	    showAnim : null,
	    showSpeed:0,
		cssBeforeShow : {},
		cssAfterShow : {},
		beforeShow : [],
		afterShow : [],
		sync: false,
		removeAfterHide : false,
		xOffset :0,
		yOffset :0,
		doBeforeHide : function(jqToHide) {
			var param = [jqToHide];
			for(i=0; i < this.beforeHide.length; i++ )
				this.beforeHide[i].apply(this,param);
			jqToHide.css(this.cssBeforeHide);
		},
		doAfterHide : function(jqToHide) {
			var param = [jqToHide];
			for(i=0; i < this.afterHide.length; i++ )
				this.afterHide[i].apply(this,param);
			jqToHide.css(this.cssAfterHide);
			jqToHide.hide();
            if (typeof this.onHide == 'function') {
            	this.onHide();
			}
		},
		doBeforeShow : function(jqToShow) {
			var param = [jqToShow];
			for(i=0; i < this.beforeShow.length; i++ )
				this.beforeShow[i].apply(this,param);
			jqToShow.css(this.cssBeforeShow);
		},
		doAfterShow : function(jqToShow) {

			var param = [jqToShow];
			for(i=0; i < this.afterShow.length; i++ )
				this.afterShow[i].apply(this,param);
            jqToShow.css(this.cssAfterShow);
			jqToShow.css('opacity',1).show(); // opacity bit needed to handle reinit case
			if ($.browser.msie) jqToShow[0].style.removeAttribute('filter');
            if (typeof this.onShow == 'function') {
            	this.onShow();
            }
		},
		doHideAnimate : function(jqToHide,jqToShow) {
			var mgr = this;
			jqToShow.hide();
			jqToHide.animate(this.hideAnim, this.hideSpeed, function() { //
				jqToHide.hide();
				mgr.doAfterHide(jqToHide);
				if( !mgr.sync ) mgr.doShow(jqToShow);
            });
			if ( mgr.sync ) this.doShow(jqToShow);
		},
		doShowAnimate : function(jqToShow) {
			var mgr = this;
            jqToShow.animate(this.showAnim, this.showSpeed, function() {
				jqToShow.show();
				mgr.doAfterShow(jqToShow);
             });
		},
		doShow : function (jqToShow) {
			this.doBeforeShow(jqToShow);
 			if ( this.showAnim && this.showSpeed ) {
				this.doShowAnimate(jqToShow);
			} else {
				jqToShow.show();
				this.doAfterShow(jqToShow);
            }
		},
		doHide : function(jqToHide,jqToShow) {
			this.doBeforeHide(jqToHide);
 			if ( this.hideAnim && this.hideSpeed ) {
				this.doHideAnimate(jqToHide,jqToShow);
 			} else {
				jqToHide.hide();
				this.doAfterHide();
			    this.doShow(jqToShow);
	        }
		},
		toggleDisplay : function(jqToHide,jqToShow) {
			this.doHide(jqToHide,jqToShow);
		},
		init : function () {
			switch( this.fx ) {
				case 'toss':
					tossFx(this);
					break;
				case 'zoom':
					zoomFx(this);
					break;
				case 'vScroll':
					vScrollFx(this);
					break;
				case 'fade':
					fadeFx(this);
					break;
				case 'shuffle':
					shuffleFx(this);
					break;
				case 'replaceContent':
					this.toggleDisplay = replaceContent;
					break;
				case 'replaceImage':
					this.toggleDisplay = replaceImage;
					break;
			}

		}
	};
	
	var defaultContentMgr = {
		id : "contentMgr",
		display:$.extend({},defaultDisplayMgr),
		alternateDisplay: null,
		contents:null,
		urlSelect:null,
		activeIndex: 0,
		maxIndex:0,
		wrapIndex : true,
		dynamicLoad : false,
		removeAfter : false,
		isImage : false,
		urlList : null,
		jqContainer: null,
		jqContents : null,
		jqCacheContents : null,
		cache : false,
		slideShowDelay : 500,
		slideShowCycle : 2000,
		slideShowEnabled : false,
		beforeDynamicLoad : function () {
		},
		afterDynamicLoad : function () {
		},
		//initList : [],
		onShow : function () {
//it is possible that hide have not finish
			//this.resetActiveContent();
//do on certian condition only
			this.jqContents = this.jqContainer.find(this.contents);
			this.jqActiveContent = this.jqContents.filter(':visible');

			if ( this.slideShowEnabled )
				this.delayNext();
		},
		onHide : function () {
		},
		delayNext : function (delay) {
			if ( this.slideShowEnabled ) {
				var mgr = this;
				var handler = function () {
					mgr.next();
				}
				this.jqContainer.executeOnce(this.id+'sstimer',delay || this.slideShowCycle, handler, 'block');
			}
		},
		startSlideShow : function() {
			this.slideShowEnabled = true;
			this.delayNext(this.slideShowDelay);
		},
		stopSlideShow : function () {
			this.slideShowEnabled = false;
			this.jqContainer.stopExecution(this.id+'sstimer');
		},
		resetActiveContent : function () {
			var previous = this.jqActiveContent;
			this.jqActiveContent = this.jqContents.filter(':visible');
			if ( this.jqActiveContent.length > 1 ) {
				var idx = this.jqActiveContent.index(previous[0]);
				this.jqActiveContent = $(this.jqActiveContent[idx == 0 ? 1 :0 ]);
			}
		},
		switchToIndex : function(idx) {
			if ( idx != this.activeIndex ) {
				if ( this.cache ) {
					var url = this.urlList[idx];
					if ( this.urlList[url] ) {
						this.switchToContent(this.urlList[url]); 
						this.activeIndex = idx;
					} else {
						this.loadContent(url);
					}
				} else if ( this.dynamicLoad ) {
					this.loadContent(this.urlList[idx]);
				} else {
					this.switchToContent($(this.jqContents[idx]));
					this.activeIndex = idx;
				}
			}
		},
		switchToContent : function(jqTarget) {
			if ( this.jqContents.length > 1 )
				this.jqActiveContent = this.jqContents.filter(':visible');
			else
				this.jqActiveContent = this.jqContents;
			this.display.jqShowSrc = this.jqShowSrc;
			this.display.jqHideTarget = this.jqCurrent;
			this.display.toggleDisplay(this.jqActiveContent,jqTarget);
		},
		previous : function() {
			if ( this.activeIndex > 1 ) {
				this.switchToIndex(this.activeIndex-1);
			} else if ( this.wrapIndex ) {
				this.switchToIndex(this.maxIndex);
			}
		},
		next : function() {
			if ( this.activeIndex < this.maxIndex ) {
				this.switchToIndex(this.activeIndex + 1);
			} else {
				if (this.wrapIndex || this.slideShowEnabled ) {
				this.switchToIndex(0);
				}
			}
		},
		loadContent : function (url,idx) {
			this.beforeDynamicLoad();
			if ( this.isImage ) {
				this.dynamicLoadImage(url);
			} else {
				//call  before dynamic load
				//opts.jqSelected.addClass('loading');
				var mgr = this;
				this.jqActiveContent.parent().loadContent(url,null,function(html) {mgr.afterLoad(url,$(html),false);},null);
			}
		},
		dynamicLoadImage : function (url) {
			var imgPreloader = new Image();
			var mgr = this;
			imgPreloader.onload=function(){
				mgr.afterLoad(url,$(imgPreloader),mgr.display.fx != 'replaceImage');
			}
			imgPreloader.src = url;
		},
		afterLoad : function (url,elem,append) {
			this.afterDynamicLoad();
			var index = this.urlList.indexOf(url);
			if ( append )
				elem.hide().appendTo(this.jqActiveContent.parent());
			//elem.find('input:text').inputFields();

			if ( this.cache	) {
				this.urlList[url] = elem;
				this.switchToIndex(index);
			} else {
				this.activeIndex = index;
				this.switchToContent(elem); 
			}
		},
		initContext : function () {
			this.resetActiveContent();
			if ( this.urlSelect || this.getUrls) {
				this.dynamicLoad = this.display.dynamicLoad = true;
				if ( this.alternateDisplay )
				    this.alternateDisplay.dynamicLoad = true;
				var urls;
				//for backward compatibility - should be remove
				if ( this.getUrls ) {
				    urls = this.getUrls();
					this.maxIndex = this.urlList.length -1;
				} else {
				    if ( this.urlSelect.charAt(0) == '[' && this.urlSelect.charAt(this.urlSelect.length - 1) == ']' ) {
				    	//if ( this.urlSelect == '[img]' ) {
					    urls = this.urlSelect.substring(1,this.urlSelect.length-1);
				    } else {
				        urls = this.jqContainer.find(this.urlSelect);
				        if ( urls.length > 0 ) {
					        urls = urls.attr('urls');
				        }
				    }
				    if ( urls.length > 0 ) {
					    this.urlList = urls.splitUrls();
					    this.maxIndex = this.urlList.length -1;
				    }
				}
				
				if ( this.isImage ) {
					this.activeIndex = urls.indexOf(this.jqContents[0].src);
				//else {
					//this.activeIndex = this.jqContents.index(this.jqActiveContent[0]);
				}
			} else {
				this.maxIndex = this.jqContents.length - 1;
				this.activeIndex = this.jqContents.index(this.jqActiveContent[0]);
			}
		},
		init : function () {
			var mgr = this;
			if ( this.jqContainer ) {
        		this.jqContents = this.jqContainer.find(this.contents);
			}
			if ( this.jqContents ) {
				this.display.jqContentContainer = this.jqContents.parent();
				if ( this.alternateDisplay ) this.alternateDisplay.jqContentContainer = this.jqContents.parent();
				this.initContext();
			}
			//replcae image only if dynamic and isImage
			if ( this.display.fx == '' ) {
				if ( this.dynamicLoad && this.isImage )
					this.display.fx = 'replaceImage';
				else
					this.display.fx = 'replaceContent';
			}
			if ( this.dynamicLoad && this.fx == 'toss' )
				this.display.removeAfterHide = true;
			this.display.init();
			this.display.onShow = function () {
				mgr.onShow();
			}
			this.display.onHide = function () {
				mgr.onHide();
			}
			if ( this.alternateDisplay) {
			    if ( this.alternateDisplay.fx == '' ) {
				    if ( this.dynamicLoad && this.isImage )
					    this.alternateDisplay.fx = 'replaceImage';
				    else
					    this.alternateDisplay.fx = 'replaceContent';
			    }
			    this.alternateDisplay.init();
			    this.alternateDisplay.onShow = function () {
				    mgr.onShow();
			    }
			    this.alternateDisplay.onHide = function () {
				    mgr.onHide();
			    }
			}
			//(this.initList.length);
			if ( this.initList )
			for(i=0; i < this.initList.length; i++ )
				this.initList[i].apply(this);

		}
	};
	
	function extendDisplay(displayOptions) {
	    var display=$.extend({},defaultDisplayMgr,displayOptions);
		display.beforeHide = [].concat(defaultDisplayMgr.beforeHide);
		if ( displayOptions && displayOptions.beforeHide )
			display.beforeHide.concat(displayOptions.beforeHide);
		display.afterHide = [].concat(defaultDisplayMgr.afterHide);
		if ( displayOptions && displayOptions.afterHide )
			display.afterHide.concat(displayOptions.afterHide);
		display.beforeShow = [].concat(defaultDisplayMgr.beforeShow);
		if ( displayOptions && displayOptions.beforeShow )
			display.beforeShow.concat(displayOptions.beforeShow);
		display.afterShow = [].concat(defaultDisplayMgr.afterShow);
		if ( displayOptions && displayOptions.afterShow )
			display.afterShow.concat(displayOptions.afterShow);
		return display;
	}

	$.fn.configureContentManager = function(options) {
		if ( options.contents == undefined )
        	options.contents = '>';

	    var settings = $.extend({},defaultContentMgr,options);
	    settings.display = extendDisplay(options.display);
	    if ( options.alternateDisplay ) {
	        settings.alternateDisplay = extendDisplay(options.alternateDisplay);
	    }

		var doClone = this.length > 1;
		this.each(function() {
			var config = doClone ? $.extend({},settings) : settings;
			config.jqContainer = $(this);
			if ( doClone ) {
				config.display = $.extend({},settings.display);
				if ( config.alternateDisplay ) {
				    config.alternateDisplay = $.extend({},settings.alternateDisplay);
				}
			}
			config.init();
		    jQuery.data(this, config.id, config);
		});
		return this;

	};
	
	jQuery.fn.extend({
		startSlideShow: function() {
			this.each(function() {
		    	var contentMgr = jQuery.data(this, defaultContentMgr.id);
				if ( contentMgr )
					contentMgr.startSlideShow();
			});
			return this;
		},
		stopSlideShow: function() {
			return this.each(function() {
		    	var contentMgr = jQuery.data(this, defaultContentMgr.id);
				if ( contentMgr )
					contentMgr.stopSlideShow();
			});
		}
	});


	/*
	 * $('conatiner').hoverSlideShow(options)
	 */
	$.fn.hoverSlideShow = function(options) {
		this.configureContentManager(options);
		return this.each(function() {
			$(this).bind('mouseleave',function(e) {
				$(this).stopSlideShow();
			}).bind('mouseenter',function(e) {
				$(this).startSlideShow();
			});
		});
	};

	var navMgr = {
	    navId : null,
		locked:false,
		navs : 'li',
		selectedClass:'selected',
		disabledClass:'disabled',
		hoverClass: 'hover',
		nextButton: null,
		previousButton : null,
        previousButtonHoverClass : null,
        nextButtonHoverClass : null,
		activeClass : 'active',
		contentContainer:null,
		initList : [],
		activeNavIndex : 0,
		getActiveIndex : function () {
		    return this.activeNavIndex;
		},
		beforeDynamicLoad : function () {
			if ( this.onloadClass) {
				this.jqSelected.addClass(this.onloadClass);
			}
		},
		afterDynamicLoad : function () {
			if ( this.onloadClass) {
				this.jqSelected.removeClass(this.onloadClass);
			}
		},
		navSelection : function () {
			this.jqShowSrc = this.jqSelected;
			this.activeNavIndex = this.jqNavs.index(this.jqSelected);
			this.switchToIndex(this.activeNavIndex);
		},
		nextTab : function () {
		    var mgr = this;
			if ( !mgr.locked) {
			    mgr.locked = true;
			    mgr.jqCurrent = mgr.jqNavs.filter('.' + mgr.selectedClass);
			    mgr.activeNavIndex = mgr.jqNavs.index(mgr.jqCurrent);
			    mgr.nextTabIndex();
			    mgr.jqSelected = $(mgr.jqNavs[mgr.activeNavIndex]);
			    mgr.navSelection();
	        }
		},
		nextTabIndex : function() {
		    if (this.activeNavIndex == this.maxIndex )
		        this.activeNavIndex =0;
	        else
				this.activeNavIndex++;
        },
        previousTabIndex : function () {	
        	if (this.activeNavIndex == 0 )
				this.activeNavIndex =this.maxIndex;
			else
				this.activeNavIndex--;
	    },
		addToInitList : function () {
		    this.initList.push(function() {
				var mgr = this;
				if ( mgr.navId ){
                    jQuery.data(mgr.jqNavContainer[0], mgr.navId,mgr);
                }
                this.jqNavs = this.jqNavContainer.find(this.navs);
				if ( this.jqNavs.length == 0)
					$.log("can't find " + this.navs);
		        this.locked =false;
		        if ( this.nextButton ) {
		            this.jqNext = this.jqNavContainer.find(this.nextButton);
					if ( this.activeClass && this.wrapIndex )
						this.jqNext.addClass(this.activeClass);
					if ( this.nextButtonHoverClass )
					    this.jqNext.hoverClass(this.nextButtonHoverClass);
		            this.jqNext.click(function() {
						if ( $(this).hasClass(mgr.activeClass) && !mgr.locked) {
            	            if (mgr.alternateDisplay ) mgr.display = mgr.alternateDisplay;
						    mgr.nextTab();
						}
					});
		        }
		        if ( this.previousButton ) {
		            this.jqPrevious = this.jqNavContainer.find(this.previousButton);
					if ( this.activeClass && this.wrapIndex )
						this.jqPrevious.addClass(this.activeClass);
					if ( this.previousButtonHoverClass) 
					    this.jqPrevious.hoverClass(this.previousButtonHoverClass);
		            this.jqPrevious.click(function() {
						if ( $(this).hasClass(mgr.activeClass) && !mgr.locked) {
							mgr.jqCurrent = mgr.jqNavs.filter('.' + mgr.selectedClass);
				    		mgr.activeNavIndex = mgr.jqNavs.index(mgr.jqCurrent);
				    		mgr.previousTabIndex();
							mgr.jqSelected = $(mgr.jqNavs[mgr.activeNavIndex]);
							mgr.locked = true;
            	            if (mgr.alternateDisplay ) mgr.display = mgr.alternateDisplay;
							mgr.navSelection();
						}
					});
		        }
		        if ( this.hoverClass ) {
		            this.jqNavs.hoverClass(this.hoverClass);
		            if ( this.jqNext )
		                this.jqNext.hoverClass(this.hoverClass);
		            if ( this.jqPrevious )
		                this.jqPrevious.hoverClass(this.hoverClass);
		        }
		        var mgr = this;
		        this.display.afterHide.push(function() {
			        mgr.jqCurrent.removeClass(mgr.selectedClass);
		        });
		        this.display.afterShow.push(function() {
			        if ( mgr.jqSelected ) {
				        mgr.jqSelected.addClass(mgr.selectedClass);
				        mgr.jqSelected = null;
			        }
			        //update the next/previous if exist
			        mgr.locked = false;
		        });
		        this.mainDisplay = this.display;
		        if ( this.alternateDisplay ) {
		            this.alternateDisplay.afterHide.push(function() {
			            mgr.jqCurrent.removeClass(mgr.selectedClass);
		            });
		            this.alternateDisplay.afterShow.push(function() {
			            if ( mgr.jqSelected ) {
				            mgr.jqSelected.addClass(mgr.selectedClass);
				            mgr.jqSelected = null;
			            }
			            //update the next/previous if exist
			            mgr.locked = false;
		            });
		        }
			    this.jqNavs.bind('click', function(e) {
				    e.preventDefault();
                    if (mgr.locked ) {
	 				    this.blur();
            		    return false;
            	    }           	    
				//selected
				    mgr.jqCurrent = mgr.jqNavs.filter('.' + mgr.selectedClass);
				    mgr.activeNavIndex = mgr.jqNavs.index(mgr.jqCurrent);
					mgr.jqSelected = $(this);

				// if animation is still running, tab is selected or disabled or onClick callback returns false stop here
            	// check if onClick returns false last so that it is not executed for a disabled tab
            	    if (mgr.locked || mgr.jqSelected.is('.' + mgr.selectedClass) || mgr.jqSelected.is('.' + mgr.disabledClass) ) {
	 				    this.blur();
            		    return false;
            	    }
            	    mgr.locked = true;
            	    mgr.display = mgr.mainDisplay;
				    mgr.navSelection();
			    });
				
            });
	    }
	};
	
	/*
	 * $('conatiner of tabs').navs(options)
	 */
	$.fn.navs = function(options) {
	    var settings = $.extend({},navMgr,options);
	    settings.initList = [];
	    settings.jqNavContainer = this;
		settings.addToInitList();
		var contents = $(settings.contentsContainer);
		if ( contents.length == 0 )
			$.log('unable to find nav content' + settings.contentsContainer);
		else
			contents.configureContentManager(settings);
		return this;
	};
	$.fn.applyToNavMgr = function(id,fn){
        var mgr = jQuery.data(this[0],id);
        if ( mgr != null )
			fn.apply(this, [mgr]);
		return this;
	}

	$.fn.allowDrag = function(src,options){
		var dragMgr = null;
		var _drag = function(e) {
			e.preventDefault();
			if ( dragMgr )
				dragMgr.drag(e);
		}
		var _dragStop = function(e) {
			e.preventDefault();
			if ( dragMgr )
				dragMgr.dragStop(e);
		}
		var mleave = function(e) {
			e.preventDefault();
			if (! e.relatedTarget) {
				if ( dragMgr )
					dragMgr.dragStop(e);
			}
		}

		var defaultDragMgr = {
			sensitivity:0,
			trackMouseMove : function(e) {
			},
			drag : function(e) {
				//if ( e.which == 1 ) {
				if ( this.dragMode == 'start' ) {
					var xDelta = e.pageX - this.mX;
					var yDelta = e.pageY - this.mY;
					if ( ( Math.abs(xDelta) > dragMgr.sensitivity) || (Math.abs(yDelta)  > dragMgr.sensitivity) ) {
						this.dragMode = 'dragging';
					}
				}
				if ( this.dragMode == 'dragging' ) {
					this.trackMouseMove(e);
				}
				/*} else {
					this.dragStop(e);
				}*/
			},
			dragStop : function (e) {
				if ( this.dragMode ) {
					$(document).unbind('mousemove',_drag).unbind('mouseup',_dragStop).unbind('mouseout',mleave);
					dragMgr = null;
					this.dragMode = null;
				}
			}
		};
		var content = this;
		$(src,this).bind('mousedown',function (e) { 
			if ( dragMgr == null || !dragMgr.dragMode ) {
			    e.preventDefault();
				dragMgr =$.extend({},defaultDragMgr, options);
				dragMgr.mX = dragMgr.oX = e.pageX;
				dragMgr.mY = dragMgr.oY = e.pageY;
				dragMgr.offset = content.position();

				dragMgr.dragMode='start';
				$(document).bind('mouseout',mleave).bind('mouseup',_dragStop).bind('mousemove',_drag);
			}
		}).css({cursor:'move'});
		
		return this;
		
	};

	
	/*
 	 * Layer object for popup menu, tooltip, dialog (modal/none modal)
 	 * shimlayer is needed only for <= IE6
	 * shimlayer sizes modal dialog: full window size; none-modal, tooltip, popup: size of container
 	 * zIndex 1000 *n reserve for shim layer
 	 * zIndex 1000 * n + 1 reserver for modal overlay
 	 * zIndex 1000 * n  + 2 reserve for each container 
 	 */	
	var _needShimLayer = ($.browser.msie && ($.browser.version < 7));
	$.layerMgr = {
			_layers : [],
			newLayer : function( content,options ) {
				var defaultLayer = {
					cloneData : false,
					onOpen : null,
					onClose : null,
					onOpenEvents : [],
					onCloseEvents : [],
					onInit : function() {},
					addOnOpenEvent : function (f) {
						this.onOpenEvents.push(f);
					},
					open: function (external) {
						if (!external && $.isFunction(this.onOpen)) {
							// execute the onOpen callback 
					        this.onOpen.apply(this);
						}
						else {
							if ( this.cloneData ) {
					            this.jqClonedContent = this.jqContent.clone().appendTo('body');
							}
							if ( this.jqShim ) {
								this.jqShim.show();
							}
							if ( this.jqOverlay ){
								this.jqOverlay.show();
								//this.jqOverlay.fadeIn('slow');
							}
							this.jqContent.show();
							//this.container.slideDown('slow');
						}
						// bind default events
						this.bindEvents();
					},
					close: function (external) {
						//call close on all layers with higher index than the current index
						$.layerMgr._layers.pop();
						if ($.isFunction(this.onClose) && !external) {
							// execute the onClose callback
							this.onClose.apply(this);
						}
						else {
						    for(var i=0; i < this.onCloseEvents.length; i++ ){
							    this.onCloseEvents[i].apply(this);
						    }
							this.jqContent.hide();
							if ( this.cloneData ) {
							    this.jqContent.remove();
								this.jqContent = this.jqClonedContent;
							}
							if ( this.jqOverlay )
								this.jqOverlay.hide();
								//this.jqOverlay.fadeOut('slow');
							if (this.jqShim) {
								//if ( this.jqShim == this._modalShimLayer )
								//	this.jqShim.hide();
								//else
									this.jqShim.remove();
							}
						    this.unbindEvents();
						    if ( this.src ) {
							    this.src._layer = null;
							    this.src = null;
						    }
						}
					},
					trackMouseMove :function( e ) {
						var xDelta = e.pageX - this.mX;
						var yDelta = e.pageY - this.mY;
						if ( ( Math.abs(xDelta) > this.sensitivity) || (Math.abs(yDelta)  > this.sensitivity) ) {
							var offset = this.jqContent.position();
							this._moveTo((offset.left + xDelta),(offset.top + yDelta));
							this.mX = e.pageX;
							this.mY = e.pageY;
						}

					},
					bindEvents: function () {
						for(var i=this.onOpenEvents.length-1; i >= 0; i-- )
							this.onOpenEvents[i].apply(this);
					},
					unbindEvents: function () {
					},
					createShimLayer : function() {
						if ( _needShimLayer )
							return $('<iframe src="javascript:false;" frameBorder=0 class="shim">')
								.css({position: 'absolute',height: '100%',width: '100%',top: '0px',left: '0px'})
								.appendTo('body');
						return null;
					},
					_moveTo : function ( left, top ) {
						var css = {position:'absolute', top:top+'px', left:left+'px'};
						if ( this.jqShim ) {
							this.jqShim.css(css);
						}
						this.jqContent.css(css);
						//alert(this.jqContent.html());
					},
					createOverlay : function () { return null; }

				};
		
				function setZindex(layer, index ) {
					index = (index + 1) * 1000;
					if ( layer.jqShim )
						layer.jqShim.css({zIndex : index});
					++index;
					if ( layer.jqOverlay )
						//layer.jqOverlay.css({zIndex : index, opacity : .5});
						layer.jqOverlay.css({zIndex : index});
					++index;
					layer.jqContent.css({zIndex : index});
				}
				function initLayer (layer,content) {
					layer.layers = $.layerMgr._layers;
					layer.layers.push(layer);
					var index = layer.layers.length;
					layer.index = index;
					layer.jqShim = layer.createShimLayer();
					layer.jqOverlay = layer.createOverlay();
					layer.jqContent = $(content);
					layer.onInit();
					setZindex(layer,index);
				};
				var layer = $.extend({}, defaultLayer, options);
				initLayer(layer,content);
				return layer;
			}
		};
		
	jQuery.extendLayer = function(defaultOpts,options) {
		var opts =$.extend({}, defaultOpts, options);
        opts.onOpenEvents = defaultOpts.onOpenEvents ? [].concat(defaultOpts.onOpenEvents): [];
		if ( options && options.onOpenEvents )
			opts.onOpenEvents = opts.onOpenEvents.concat(options.onOpenEvents );
        opts.onCloseEvents = defaultOpts.onCloseEvents ? [].concat(defaultOpts.onCloseEvents): [];
		if ( options && options.onCloseEvents )
			opts.onCloseEvents = opts.onCloseEvents.concat(options.onCloseEvents );
		return opts;
	};
	function fitHorizontal(x,w) {
	    x -= $(document).scrollLeft(); 
	    return x >= 0  && $(window).width()>= (x + w); 
    }
	function fitVertical(y,h) {
	    y -= $(document).scrollTop(); 
	    return y >= 0 && $(window).height()>= (y + h); 
    }
	/*
	 * $(content).popupLayer(eventSrc,options)
	 */
	$.fn.popupLayer = function(src,options) {
		var defaultPopuLayer = {
			positionBy : 'source',
			//source ref - left is same as bottomLeft
			positionRef : 'bottomLeft',
			targetRef : 'topLeft',
			pointerLength : 0,
			sourceMovable : false,
			xOffset : 0,
			yOffset : 0,
			beforeOpenPopup : function () {},
			targetLeftSrcLeftX : function(srcX,srcW,popupW){
				this.srcHorPos = 'left';
			    var x = srcX + this.xOffset;
			    if ( fitHorizontal(x,popupW) ) return x;
                var x2 = srcX + srcW - popupW - this.xOffset;
			    if ( fitHorizontal(x2,popupW) ) {this.srcHorPos = 'right';return x2;}
	            return x; 
			},			
			targetLeftSrcRightX : function(srcX,srcW,popupW){
				this.srcHorPos = 'left';
			    var x = srcX + srcW + this.xOffset;
			    if ( fitHorizontal(x,popupW) ) return x;
			    //try aligning right
			    var x2 = srcX + srcW - popupW - this.xOffset;
			    if ( fitHorizontal(x2,popupW) ) {this.srcHorPos = 'right';return x2;}
	            return x; 
			},			
			targetRightSrcLeftX : function(srcX,srcW,popupW){
				this.srcHorPos = 'right';
			    var x = srcX - popupW + this.xOffset;
			    if ( fitHorizontal(x,popupW) ) return x;
			    //try aligning right
			    var x2 = srcX - this.xOffset;
			    if ( fitHorizontal(x2,popupW) ) {this.srcHorPos = 'left';return x2;}
			    //align to the edge of the window
	            return x; 
			},			
			targetRightSrcRightX : function(srcX,srcW,popupW){
				this.srcHorPos = 'right';
			    var x = srcX + srcW - popupW + this.xOffset;
			    if ( fitHorizontal(x,popupW) ) return x;
			    //try aligning left
			    var x2 = srcX - this.xOffset;
			    if ( fitHorizontal(x2,popupW) ) {this.srcHorPos = 'left';return x2;}
	            return x; 
			},			
			targetTopSrcTopY : function(srcY,srcH,popupH){
				this.srcVerPos = 'top';
			    var y = srcY + this.pointerLength + this.yOffset;
			    if ( fitVertical(y,popupH) ) return y;
			    //try aligning top
			    var y2 = srcY - popupH - this.pointerLength - this.yOffset;
			    if ( fitVertical(y2,popupH) ) {this.srcVerPos = 'bottom';return y2;};
	            return y; 
			},			
			targetTopSrcBottomY : function(srcY,srcH,popupH){
				this.srcVerPos = 'top';
			    var y = srcY + srcH + this.pointerLength + this.yOffset;
			    if ( fitVertical(y,popupH) ) return y;
			    var y2 = srcY - popupH - this.pointerLength - this.yOffset;
			    if ( fitVertical(y2,popupH) ) {this.srcVerPos = 'bottom';return y2;}
	            return y; 
			},			
			targetBottomSrcTopY : function(srcY,srcH,popupH){
				this.srcVerPos = 'bottom';
			    var y = srcY -popupH - this.pointerLength + this.yOffset;
			    if ( fitVertical(y,popupH) ) return y;
			    //try aligning bottom
			    var y2= srcY + srcH + this.pointerLength - this.yOffset;
			    if ( fitVertical(y2,popupH) ) {this.srcVerPos = 'top';return y2;};
				return y;
			},			
			targetBottomSrcBottomY : function(srcY,srcH,popupH){
				this.srcVerPos = 'bottom';
			    var y = srcY + srcH -popupH - this.pointerLength + this.yOffset;
			    if ( fitVertical(y,popupH) )return y;
			    var y2 = srcY + srcH + + this.pointerLength - this.yOffset;
			    if ( fitVertical(y2,popupH) ){this.srcVerPos = 'top';return y2;};
	            return y; 
			},			
			calculateX : function(srcX,srcW,popupW,srcAlign,targetAlign){
			    if ( targetAlign == 'left' ) {
			        if ( srcAlign == 'left' ) {
			            return this.targetLeftSrcLeftX(srcX,srcW,popupW);
			        } else {
			            return this.targetLeftSrcRightX(srcX,srcW,popupW);
			        }
			    } else {
			        if ( srcAlign == 'left' ) {
			            return this.targetRightSrcLeftX(srcX,srcW,popupW);
			        } else {
			            return this.targetRightSrcRightX(srcX,srcW,popupW);
			        }
			    }
			},
			calculateY : function(srcY,srcH,popupH,srcAlign,targetAlign){
				//alert(srcAlign + ":" + targetAlign);
			    if ( targetAlign == 'top' ) {
			        if ( srcAlign == 'top' ) {
			            return this.targetTopSrcTopY(srcY,srcH,popupH);
			        } else {
			            return this.targetTopSrcBottomY(srcY,srcH,popupH);
			        }
			    } else {
			        if ( srcAlign == 'top' ) {
			            return this.targetBottomSrcTopY(srcY,srcH,popupH);
			        } else {
			            return this.targetBottomSrcBottomY(srcY,srcH,popupH);
			        }
			    }
			},
			openPopup : function ( src ) {
				this.src = src;
				this.beforeOpenPopup();
				if ( this.sourceMovable ) {
				    this.jqSrcContainer = $(this.src).parent();
				    this.jqSrcContainer.css({position:'relative'});
				    this.jqContent.remove().css({position:'absolute'});
				    this.jqSrcContainer.append(this.jqContent);
				    if ( this.jqShim ){
				        this.jqShim.remove().appendTo(this.jqSrcContainer);
				    }
			    } 
			    
			    //if ( this.jqContent.parent().length == 0 )
			    //    this.jqContent.appendTo('body');
				src._layer = this;
				//quickly show the container and its content so that browser can 
				// calculate actual width and height
				this.jqContent.show();
				var w = this.jqContent.outerWidth();
				var h = this.jqContent.outerHeight();
				this.left=0;
				this.top = 0;
				this.offset(src,w,h);
				this.jqContent.hide();
				this._sizeTo(w,h);
				this._moveTo(this.left,this.top);
				this.open();
			},
			offset : function(src,w,h) {
					var jqSrc = $(src);
					if ( this.positionBy == 'source' ) {
						if ( this.positionRef == 'left' ) this.positionRef = 'topLeft';
						this.verPos =this.positionRef == 'topRight' ||this.positionRef == 'topLeft' ? 'top' : 'bottom'; 
						this.horPos = this.positionRef == 'bottomLeft' ||this.positionRef == 'topLeft' ? 'left' : 'right';
						//alert(this.positionRef + "===" + this.targetRef);
						var offset = jqSrc.offset();
						this.left = this.calculateX(offset.left,jqSrc.outerWidth(),w,this.horPos,this.targetRef == 'bottomLeft' || this.targetRef == 'topLeft' ? 'left' : 'right');
						this.top = this.calculateY(offset.top,jqSrc.outerHeight(),h,this.verPos,this.targetRef == 'topRight' ||this.targetRef == 'topLeft' ? 'top' : 'bottom');
						if ( this.pointerLength > 0 ) {
							this.positionClass = '.' + this.srcVerPos + '-' + this.srcHorPos + '-arrow';;
							$(this.positionClass,this.jqContent).show();
						}
						if ( this.sourceMovable ) {
							offset = this.jqContent.parent().offset();
							this.left -= offset.left;
							this.top -= offset.top;
						}
					} else {
						this.left = this.mX + this.xOffset;
						this.top = this.mY + this.yOffset;
					}
				},
			_sizeTo : function ( w, h ) {
				if ( this.jqShim ) {
					var css = {width:w+'px', height:h+'px'};
					this.jqShim.css(css);
				}
			}
		};
		var opts = $.extend({}, defaultPopuLayer, options);
		var popup = $.layerMgr.newLayer( this,opts );
		popup.openPopup(src);
		return this;
	};
	/*
	 * $(content).popup(eventSrc,options)
	 */
	var _singlePopupop = null;
	$.fn.popup = function (eventSrc,options) {
		var closePopup = function () {
		    if ( _singlePopupop ) {
		        _singlePopupop.close();
                _singlePopupop = null;
		    }
		}
		closePopup();
	    var defaultPopup = {
			hooverPopup : false,
		    closeOnClick : true,
			onOpenEvents : [
				function () {
		            _singlePopupop = this;
		            if ( this.closeOnClick )
		                $(document).bind('click',closePopup);
					if ( this.hooverPopup ) {
						//set delay on mouseleave
						this.jqContent.bind("mouseleave", closePopup);
					}

			}],
			onCloseEvents : [
				function () {
		        if ( this.closeOnClick )
		            $(document).unbind('click',closePopup);
				if ( this.hooverPopup ) {
				    this.jqContent.unbind("mouseleave", closePopup);
				}
		         _singlePopupop = null;
			}]

		};
		var opts = $.extendLayer(defaultPopup,options);
		$(this).popupLayer(eventSrc,opts);
		return this;
	};

	/*
	 * $(eventSrcs).attachHoverPopup(content,options)
	 */
	$.fn.attachPopup = function(content,startevent,options) {
		// default configuration options
		var defaultPopup = {
			delay: 150,
			sensitivity: 5,
			hooverPopup : true,
			onCloseEvents : [
				function () {
				cleanPopup(this.src);
			}],
			onOpenEvents : [
				function () {
					var popup = this;
					var src = this.src;
					this.jqContent.bind("click", function(e) {
						popup.close();
					})
					.bind("mouseenter", function(e) {
						cleanPopup(src);
					})
					.bind("mouseleave", function(e) {
						//close popup but delay it just in case user move back to the src that trigger
						//of this popup
						hidePopup(src,'container mouseleave');
					});
					$('.closeBtn',popup.jqContent).bind('click',function (e) {
				    	popup.close();
			        });

				}]
		};
		var options = $.extendLayer(defaultPopup,options);
		
		var showPopup = function (content,src,opts) {
			cleanPopup(src);
			$(content).popup(src,opts);
		};
		var hidePopup = function(src,tag) {
			if ( src._layer )
				src._hoverPopup_t = setTimeout(function() { if( src._hoverPopup_t && src._layer)src._layer.close();cleanPopup(src);},options.delay);
		};
		var cleanPopup = function(src) {
			if (src && src._hoverPopup_t) { clearTimeout(src._hoverPopup_t); src._hoverPopup_t=null;}
		};
		var jqContent = $(content);
		var events;
		if ( options.positionBy == 'mouse') {
			events = ' mousemove mouseleave';
		} else {
			events = ' mouseleave';
		}
		events = startevent + events;
		return this.each(function(){
			var src = this;
			$(src).bind(events,function(e) {
				// next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut
                if ( e.type != "click") {
				var p = (e.type == "mouseenter" ? 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);

				// else e.type == "onmouseover"
				if (e.type == "mousemove") {
					if ( src._layer ) {
						//move to new location
						var xDelta = e.pageX - src._layer.mX;
						var yDelta = e.pageY - src._layer.mY;
						if ( ( Math.abs(xDelta) > options.sensitivity) || (Math.abs(yDelta)  > options.sensitivity) ) {
							var offset = src._layer.jqContent.position();
							src._layer._moveTo((offset.left + xDelta),(offset.top + yDelta));
							src._layer.mX = e.pageX;
							src._layer.mY = e.pageY;
						}

					}
				} else if (e.type == "mouseenter" || e.type == "click") {
					if ( src._layer ) {
						//popup already opend, clear the timer of the 
						//layer so that it does not close the layer
						cleanPopup(src);
					} else {
						//delay opening of popup
						options.mX = e.pageX;
						options.mY = e.pageY;
						src._hoverPopup_t = setTimeout(function() { showPopup(content,src,options);},options.delay);
					}

				} else {
					if ( src._layer ) {
						hidePopup(src,'src ml');
					} else {
						cleanPopup(src);
					}
				}
				return false;
			});
		});
	};

	/*
	 * $(eventSrcs).attachHoverPopup(content,options)
	 */
	$.fn.attachHoverPopup = function(content,options) {
	    this.attachPopup(content,"mouseenter",options);
	    return this;
	};
	
	var menuOption = {
			name: 'Cat',
			container : '#ui-search-category', //this is just an example
			currentVal : null,
			list : null, // must be provided by caller
            startValue : function () {
                currentVal = $(this.container + ' input').val();
            },
            beforeOpenPopup : function(){
                $('#' + this.name + 'Dropdown li').removeClass("ui-selectmenu-item-focus");  
                $('#' + this.name + 'Dropdown li.itemid' + this.currentVal).addClass("ui-selectmenu-item-focus");  
            },
            createDropDown : function () {
                var str = '<ul id="' + this.name + 'Dropdown" class="ui-selectmenu-menu" >';
                for(var i = 0; i < this.list.length; i++ ){
                    str += "<li class='itemid" + this.list[i].id + "'><a href='#'>" + this.list[i].value + "</a></li>";
                }
                str += '</ul>';
                return str;
            },
            getEntry : function(id){
            	if ( id != null ) {
            		for(var i = 0; i < this.list.length; i++ ){
            			if ( id == this.list[i].id )
            				return this.list[i];
            		}
            	}
                return this.list[0];
            },
            menuSelect : function (li,val) {
            	this.setSelected(val,$(li).find('a').html());
                return this.menuSelected(li,val);
            },
            setSelected : function(val,display) {
            	$(this.container + ' input').val(val);
            	$(this.container + ' .ui-selectmenu').html(display);
            },
            menuSelected : function (li,val) {
                return false;
            }
		};
	$.fn.popupMenu = function(options,initVal) {
	    var options = $.extend({},menuOption,options);
		var contentId = '#' + options.name + 'Dropdown';
		var values = options.getEntry(initVal);
		options.setSelected(values.id,values.value);
		$(this).click(function(e) {
			options.startValue();
			var content = $(contentId);
			if ( content.length == 0 ) {
				// create content
				$(options.createDropDown()).appendTo('body');
				if ( options.list.length > 18 ){
					$(contentId).css({height: '435px',overflow : 'auto'});
				}
				$(contentId + ' li').hoverClass("ui-selectmenu-item-focus");  
				$(contentId).bind('mouseover',function(e) {
					$(contentId + ' li').removeClass("ui-selectmenu-item-focus");
					$(contentId).unbind('mouseover' );      
				});
				$(contentId + ' li').click(function(){
					$(this).removeClass("ui-selectmenu-item-focus");  
					var cls=$(this).attr('class');
					cls=cls.substring(6);
					var flag = options.menuSelect(this,cls);
					$(document).click();
					return flag;
				});
			} else {
				if ($(contentId + ":visible").length == 1 ) {
					$(document).click();
					return false;
				}
			};
			$(contentId).popup(this,options);
	        return false;
	    });

	};
    var defaultBubbleHelp = {
	        width:'320px',
  			delay: 350,
  			className : 'help-tip',
			positionRef : 'topRight',
			targetRef : 'bottomLeft',
			xOffset : -20,
  			pointerLength : 14, 
			onOpenEvents : [
				function () {
 			    	var popup = this;
			    	$('.closeBtn',popup.jqContent).click(function (e) {
				    	//e.preventDefault();
				    	popup.close();
			        });
				}],
            onCloseEvents : [
                function () {
                    if ( this.positionClass )
				        $(this.positionClass).hide();
                    this.container.remove();
		        }],
		    // overwriteing targetLeftSrcRightX of supperclass since right alligned help arrow needs extra 10 pixels shift to the left
			targetLeftSrcRightX : function(srcX,srcW,popupW){
				this.srcHorPos = 'left';
			    var x = srcX + srcW + this.xOffset;
			    if ( fitHorizontal(x,popupW) ) return x;
			    //try aligning right
			    var x2 = srcX + srcW - popupW - this.xOffset-10;
			    if ( fitHorizontal(x2,popupW) ) {this.srcHorPos = 'right';return x2;}
	            return x; 
			},			
		    xoffset : function(src,w,h) {
				var jqSrc = $(src);
				var sw = jqSrc.outerWidth();
			    var sh = jqSrc.outerHeight();

    			var offset = jqSrc.offset();
    			var horPos = 'right';
    			var verPos = 'bottom';
				var left = offset.left + (sw/2) + this.xOffset;
		        if ($(window).width()-(left -16 - $(document).scrollLeft())> w) {
		        	this.xOffset = -10;
		            horPos = 'left';
		            this.left = left - 16;
		        } else {
		            this.left = left-w+ (sw/2) + 9 + this.xOffset;
		            horPos = 'right';
		        }
    			var top = offset.top + this.yOffset;
				if ( $(window).height()-(top + 32 -$(document).scrollTop()+sh)> h) {
				    this.top = top + 32;
				    verPos = 'top';
				} else {
				    this.top = top - h - 9;
				    verPost = 'bottom';
				}
				

				this.positionClass = '.' + verPos + '-' + horPos + '-arrow';;
				$(this.positionClass,this.jqContent).show();
				

			},
            container : null
    };
	
	jQuery.extendBubbleHelp = function(options) {
		options = $.extendLayer(defaultBubbleHelp,options);
	    options.container =
 	        	$('<div class="' + options.className + '"><table border="0" cellpadding="0" cellspacing="0" width="100%">' +
				'<tr><td class="help-tip-rtl round-top-left">&nbsp;</td><td class="help-tip-rtm round-top-middle">&nbsp;</td><td class="help-tip-rtr round-top-right">&nbsp;</td></tr>' +
				'<tr><td class="help-tip-rml round-middle-left">&nbsp;</td><td class="help-tip-rm round-middle">' +		
				'<table style="float: left; display: inline;" border="0" cellpadding="0" cellspacing="0" width="100%">' +
				'<tr><td align="left" valign="top" width="100%"><div class="popText"></div></td>' +
				'<td style="padding-left: 3px;" valign="top" width="19px"><div class="closeBtn"></div></td></tr></table>' +
				'</td><td class="help-tip-rmr round-middle-right">&nbsp;</td></tr>' +
				'<tr><td class="help-tip-rbl round-bottom-left">&nbsp;</td><td class="help-tip-rbm round-bottom-middle" width="100%">&nbsp;</td><td class="help-tip-rbr round-bottom-right">&nbsp;</td></tr></table>' +
				'<div class="top-left-arrow">&nbsp;</div><div class="top-right-arrow">&nbsp;</div><div class="bottom-left-arrow">&nbsp;</div><div class="bottom-right-arrow">&nbsp;</div></div>').hide();
        return options;
    };
	
	$.fn.attachHoverBubbleHelp = function(content,options) {
		var opts = $.extendBubbleHelp(options);
		opts.beforeOpenPopup = function() {
			$('.popText',opts.container).html(content);
			opts.container.css({width:opts.width}).appendTo('body');
		}
		this.each(function() { $(this).attachHoverPopup(opts.container[0],opts)});
    };
 	$.fn.attachStaticBubbleHelp = function(content,options) {
		var opts = $.extendBubbleHelp(options);
		opts.closeOnClick =false;
		opts.beforeOpenPopup = function() {
			$('.popText',this.container).html(content);
			this.container.css({width:opts.width}).appendTo('body');
		}
        opts.container.popup(this,opts);
		return this;
    };
    
    var dynamicBubbleHelp=null;
	$.fn.attachDynamicHoverBubbleHelp = function(content,options) {
		if (!dynamicBubbleHelp)
			dynamicBubbleHelp = $.extendBubbleHelp(options);
		dynamicBubbleHelp.beforeOpenPopup = function() {
			$('.popText',dynamicBubbleHelp.container).html($(this.src).data("bubbleHelp"));
			dynamicBubbleHelp.container.css({width:dynamicBubbleHelp.width}).appendTo('body');
		}
 	    this.each(function() {
 	    	$(this).data("bubbleHelp", content);
 	    	$(this).attachHoverPopup(dynamicBubbleHelp.container[0],dynamicBubbleHelp)
 	    	if (this._layer) // if layer visible, update its content
				$('.popText', this._layer.jqContent).html(content);
 	    });
    };
   

    jQuery.searchBrowseImageConfig  = function(options) {
		var defaultOptions = {
				cookieName : 'p',
				cookieletName : 'i',
				showCookieValue : 'imgshow',
				hideCookieValue : 'imghide',
				showImages : 'Show images',
				hideImages : 'Hide images',
				toggle : '#imgOption',
				popup : '#imgRolloverPopup',
				popupSize : '_26.jpeg',
				displaySize : '_24.jpeg',
				hideClass : 'hide',
				showClass : 'tn',
				imageLoaded : false,
				cookieOptions : function() {
	        		var urlDomain = document.domain;
	        		var indexOfFirstDot = urlDomain.indexOf('.');
	        		var cookieDomain = indexOfFirstDot > 0 ? urlDomain.substring(indexOfFirstDot, urlDomain.length): urlDomain;
	        		if ( cookieDomain == 'localhost')
	        			cookieDomain = '';
	        		return {expires:365, path:'/',domain:cookieDomain};
				},
				setImagesHidenState : function () {
					var sbConfig = $.cookielet(this.cookieName, this.cookieletName);
					if ( sbConfig == null || sbConfig == this.showCookieValue) {
						$.cookielet(this.cookieName,this.cookieletName,this.hideCookieValue,this.cookieOptions());
					}
					this.hideState = true;
		        	$('.tn').addClass(this.hideClass);
		        },
				setImagesShownState : function () {
		        	$.cookielet(this.cookieName,this.cookieletName,this.showCookieValue,this.cookieOptions());
		        	this.hideState = false;
		        	$('.tn').removeClass(this.hideClass); 
		        	if ( !this.imageLoaded ) {
		        		$('.wimg').each(function() {
		        			var url = $(this).attr('img');
		        			if ( url != '') {
		        				$(this).find('img').attr('src',url);
		        			}
		        		});
		        		this.imageLoad = true;
		        	}
				}

		};
		$('body').append('<div id="imgRolloverPopup"></div>');
		options = $.extend( {},defaultOptions,options);
		var images = $('.tn img');
		images.click(function(){
			var va = $(this).parent().parent().find('a').attr('href');
			window.location = va;
		});
		images.attr('title','');
		images.parent().mouseover(function(e){
			var src = $('img',this).attr('src');
			$(options.popup).html('<img src="' + src.replace(options.displaySize,options.popupSize) + '"/>').show();
	    }).mouseout(function(){$(options.popup).hide();}).mousemove(function(e){
	    	$(options.popup).css({'left':e.pageX + 15 + 'px','top':e.pageY + 15 + 'px'});}); 
		$(options.toggle).click(function(e){
			if ( options.hideState == true )
				options.setImagesShownState();
			else
				options.setImagesHidenState();
		});
		var sbConfig = $.cookielet(options.cookieName, options.cookieletName);
		if ( sbConfig == null || sbConfig == options.showCookieValue) {
			$(options.toggle)[0].checked = true;
			options.setImagesShownState();
		} else {
			$(options.toggle)[0].checked = false;
			options.setImagesHidenState();
		}

	}
	
	
	var fieldHelpPopup = null;    
	var inputFieldsOptions = {className :'tipField', charCountClass:'charCount'};
	$.fn.inputFields = function() {
		options = inputFieldsOptions;
		if( options.className ) {
			$(window).unload(function() {$('.' + options.className).val('');});
		    $('form').submit(function() {$(this).find('.' + options.className).val('');});
		}
		this.each(function() {
    		var $this = $(this);
			var fieldTip = $this.attr('title');

    		var keycount = function(i) {
      			var max = $(this).attr('maxlength');
      			var val = $(this).attr('value');
      			var cur = 0;
      			if(val)
        			cur = val.length;
      			var left = max-cur;
      			var c = $(this).next("span").find(".counter");
      			c.text(left.toString());
      			if(left <= 10)
          			c.css("background","#F4F379");
      			else
          			c.css("background","none");
    		};
      		$this.focus(function() {
				var $$this = $(this);
        		if ($$this.is('.' + options.className)) {
          			$$this.val('').removeClass(options.className);
        		}
				if ( fieldHelpPopup ) {
					fieldHelpPopup.close();
					fieldHelpPopup = null;
				}
				var fieldHelp = $$this.attr('fieldHelp');
				if ( fieldHelp ) {
					fieldHelpPopup = $.extendBubbleHelp({});
					fieldHelpPopup.closeOnClick =false;
                    fieldHelpPopup.sourceMovable = true;
					fieldHelpPopup.beforeOpenPopup = function() {
						$('.popText',this.container).html(fieldHelp);
						this.container.css({width:'300px'});
					};
					fieldHelpPopup.container.popup(this,fieldHelpPopup);
					fieldHelpPopup = this._layer;
				}
				if ($$this.is('.' + options.charCountClass)) {
    				var max = $$this.attr('maxlength');
					if ( max ) {
    					var val = $$this.val();
    					var cur = 0;
    					if(val) // value="", or no value at all will cause an error
      						cur = val.length;
    					var left = max-cur;
    					$$this.after("<span><span class='counter'>"+ left.toString()+"</span> characters remaining</span>");
    					// Style as desired
    					var c = $$this.next("span").find(".counter");
    					c.css("margin-left","10px");
    					c.css("padding", "0 3px 0 3px")
    					c.css("border", "1px solid #ccc")
    					if(left <= 10)
        					c.css("background","#F4F379");
    					else
        					c.css("background","none");
						$$this.keyup(keycount);

					}

				}
      		});
    
      		$this.blur(function() {
				if ( fieldHelpPopup ) {
					fieldHelpPopup.close();
					fieldHelpPopup = null;
				}
				var $$this = $(this);
        		if ($$this.val() == '') {
          			$$this.addClass(options.className);
          			$$this.val(fieldTip);
				}
				if ($$this.is('.' + options.charCountClass)) {
					$$this.next('span').remove();
				}
 			});
			if ( fieldTip) {
      			if ($.browser.msie && $this.val() == fieldTip) {
        			$this.val('');
      			}
				if ($this.val() == '' && document.activeElement != this) {
        			$this.addClass(options.className);
					$this.val(fieldTip);
				}
			}
 			
			//return this;
  		});
  		return this;

	};
	$.fn.resetInputFields = function() {
 	    this.find('.' + inputFieldsOptions.className).val('').removeClass(inputFieldsOptions.className);
   };
   
   jQuery.cookie = function(name, value, options) {
	    if (typeof value != 'undefined') { // name and value given, set cookie
	        options = options || {};
	        if (value === null) {
	            value = '';
	            options.expires = -1;
	        }
	        var expires = '';
	        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
	            var date;
	            if (typeof options.expires == 'number') {
	                date = new Date();
	                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
	            } else {
	                date = options.expires;
	            }
	            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
	        }
	        // CAUTION: Needed to parenthesize options.path and options.domain
	        // in the following expressions, otherwise they evaluate to undefined
	        // in the packed version for some reason...
	        var path = options.path ? '; path=' + (options.path) : '';
	        var domain = options.domain ? '; domain=' + (options.domain) : '';
	        var secure = options.secure ? '; secure' : '';
	        document.cookie = [name, '=', value, expires, path, domain, secure].join('');
	    } 
	    else { // only name given, get cookie
	        var cookieValue = null;
	        if (document.cookie && document.cookie != '') {
	            var cookies = document.cookie.split(';');
	            for (var i = 0; i < cookies.length; i++) {
	                var cookie = jQuery.trim(cookies[i]);
	                // Does this cookie string begin with the name we want?
	                if (cookie.substring(0, name.length + 1) == (name + '=')) {
	                    cookieValue = cookie.substring(name.length + 1);
	                    break;
	                }
	            }
	        }
	        return cookieValue;
	    }
	};
	
	jQuery.cookielet = function(cookieName, cookieletName, cookiletValue, options) {
		var wholeCookieValue = jQuery.cookie(cookieName);
		if (cookiletValue) { // name and value given, set cookielet
			options = options || {};
			if (wholeCookieValue) {
				var cookiletRegEx = new RegExp('(^|\\^){1}' + cookieletName + '\\^[^^]*');
				if (wholeCookieValue.search(cookiletRegEx) != -1) {
					wholeCookieValue = wholeCookieValue.replace(cookiletRegEx, '$1'+cookieletName+'^'+cookiletValue);
				} else {
					wholeCookieValue = wholeCookieValue +'^' + cookieletName + '^' + cookiletValue;
				}
				jQuery.cookie(cookieName, wholeCookieValue, options);
			}
			else if (cookiletValue){
				jQuery.cookie(cookieName, (cookieletName+'^'+cookiletValue+'^'), options);
			}
		} else { // only name given, get cookielet value
			if (wholeCookieValue && wholeCookieValue.length > 0) {
				var ca = wholeCookieValue.charAt(0) != '^' ? wholeCookieValue.split('^') : wholeCookieValue.slice(1).split('^');
				for(var i=0; i < ca.length - 1; i+=2) {
					if (ca[i] === cookieletName) {
						return ca[i+1];
					}
				}
			}
			return null;
		}
	};
	
	(function($){
		// modified base 64, padding is set as '!', '/' is '_', '+' is '-'
		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);
	
	$.fn.shareThis = function() {
		var initAddThis = function(e) {
		    var url = 'http://s7.addthis.com/js/250/addthis_widget.js#username=polaris2009';
		    $.getScript(url);
		    $('#ui-footer').unbind('mouseenter',initAddThis);
		    return true;		
		};
		$('#ui-footer').bind('mouseenter',initAddThis);
	};
	
})(jQuery);

$(document).ready(function() {
	$('input:text').inputFields();
});
var showLocationFilter = false;
var bedroomList = [
        //{ id : 'STUDIO', value : 'Studio+'},
	    { id : '', value : 'Studio+'},
	    { id : 'ONE', value :'1+ BR'},
        { id : 'TWO' , value : '2+ BR' },
        { id : 'THREE', value : '3+ BR'},
        { id : 'FOUR', value : '4+ BR' },
        { id : 'FIVE', value : '5+ BR' },
        { id : 'MORE_THAN_SIX' , value : '6+ BR'}
    ];
var bedroomMenuOption = {
        name: 'Bedroom',
        container : '#ui-search-bedrooms', 
        list : bedroomList
     };
var bathroomList = [
	{ id : '', value : '1+ BA'},
	{ id : 'TWO', value : '2+ BA'},
	{ id : 'THREE', value : '3+ BA'},
	{ id : 'FOUR', value : '4+ BA'},
	{ id : 'FIVE', value : '5+ BA'}
	]
var bathroomMenuOption = {
		name: 'Bathroom',
        container : '#ui-search-bathrooms', 
	    list : bathroomList
	};
var petOfferedByList = [
	{ id : '', value : 'From Anyone'},
    { id : 'Shelter', value : 'From Shelter'},
    { id : 'Owner', value : 'From Owner'},
    { id : 'Breeder', value : 'From Breeder'}
    ];
var petOfferedByMenuOption = {
		name: 'PetOfferedBy',
        container : '#ui-search-petOfferedBy', 
	    list : petOfferedByList
	};
var petGenderList = [
	{ id : '', value : 'Any Gender'},
    { id : 'Female', value : 'Female'},
    { id : 'Male', value : 'Male'}
    ];
var petGenderMenuOption = {
		name: 'PetGender',
        container : '#ui-search-petgender', 
	    list : petGenderList
	};
var carSellerList = [
	{ id : '', value : 'Any Seller'},
	{ id : 'Owner', value : 'By Owner'},
    { id : 'Dealer', value : 'By Dealer'}
    ];
var carSellerMenuOption = {
		name: 'CarSeller',
        container : '#ui-search-carseller', 
	    list : carSellerList
	};
function show_CARS(minYear,maxYear,minMileage,maxMileage,soldBy) {
	var soldByName=carSellerMenuOption.container.substring(1);
	minYear = minYear == null ? '' : minYear;
	maxYear = maxYear == null ?  '' : maxYear;
	minMileage = minMileage == null ? '' : minMileage;
	maxMileage = maxMileage == null ? '' : maxMileage;
	var str = '<div class="ui-search-filter attributes">' + 
		'<label>Year</label><input id="minYear" name="cars.minYear" class="search-filter-shorttext" title="min" type="text" value="' + minYear + '"/><input id="maxYear" name="cars.maxYear" class="search-filter-shorttext" title="max" type="text" value="' + maxYear + '"/>' +
		'</div><div class="ui-search-filter attributes">' +
		'<label>Mileage</label><input id="minMileage" name="cars.minMileage" class="search-filter-shorttext" title="min" type="text" value="' + minMileage + '"/><input id="maxMileage" name="cars.maxMileage" class="search-filter-shorttext" title="max" type="text" value="' + maxMileage + '"/>' +
		'</div>' + 
		'<div id="' + soldByName  + '" class="ui-search-filter attributes">' +
		'<a style="width:100px;" tabindex="0" class="ui-selectmenu xsp" href="#"></a>' +
		'<input type="hidden" name="cars.forSaleBy" value=""/>' +
		'</div>'; 
	//if ( showLocationFilter )
		$('#attributes2').html(str).show();
	//else
		//$('#attributes1').after(str);
    $('#ui-search-carseller a').popupMenu(carSellerMenuOption,soldBy);
	$('.attributes input:text').inputFields();
}
function show_PETS(offered,gender) {
	var offeredName=petOfferedByMenuOption.container.substring(1);
	var genderName=petGenderMenuOption.container.substring(1);
	var str = '<div id="' + offeredName + '" class="ui-search-filter attributes">' +
    '<a style="width:120px;" tabindex="0" class="ui-selectmenu xsp" href="#"></a>' +
    '<input type="hidden" name="pets.offeredBy" value=""/>' +
    '</div>' + 
	'<div id="' + genderName  + '" class="ui-search-filter attributes">' +
    '<a style="width:100px;" tabindex="0" class="ui-selectmenu xsp" href="#"></a>' +
    '<input type="hidden" name="pets.gender" value=""/>' +
    '</div>'; 
	if ( showLocationFilter )
		$('#attributes2').html(str).show();
	else
		$('#attributes1').after(str);
    $('#ui-search-petOfferedBy a').popupMenu(petOfferedByMenuOption,offered);
    $('#ui-search-petgender a').popupMenu(petGenderMenuOption,gender);
	$('.attributes input:text').inputFields();
}
function show_JOBS() {
}
function show_RENTAL(bedrooms,bathrooms,petsAllowed) {
	petsAllowed = petsAllowed ? 'checked' : '';
	var str = '<div id="ui-search-bedrooms" class="ui-search-filter attributes">' +
    '<a style="width:70px;" tabindex="0" class="ui-selectmenu xsp" href="#"></a>' +
    '<input type="hidden" name="rental.noOfBedrooms" value=""/>' +
    '</div>' + 
	'<div id="ui-search-bathrooms" class="ui-search-filter attributes">' +
    '<a style="width:80px;" tabindex="0" class="ui-selectmenu xsp" href="#"></a>' +
    '<input type="hidden" name="rental.noOfBathrooms" value=""/>' +
    '</div>' + 
    '<div class="ui-search-filter attributes">' + 
    '<input id="petsAllowed" name="rental.petsAllowed" type="checkbox" value="true" ' + petsAllowed + '/><input type="hidden" name="_petsAllowed" value="on"/><label for="rental.petsAllowed"> Pets Allowed</label>' +               
    '</div>';
	//if ( showLocationFilter )
		$('#attributes2').html(str).show();
	//else
		//$('#attributes1').after(str);
	$('#ui-search-bedrooms a').popupMenu(bedroomMenuOption,bedrooms);
    $('#ui-search-bathrooms a').popupMenu(bathroomMenuOption,bathrooms);
	$('.attributes input:text').inputFields();
}
function show_COMMERCIAL(minSize,maxSize) {
	minSize = minSize == null ? '' : minSize;
	maxSize = maxSize == null ?  '' : maxSize;
	var str = '<div class="ui-search-filter attributes">' + 
		'<label>Size(sq ft)</label><input id="minSize" name="commercial.minSize" class="search-filter-shorttext" title="min" type="text" value="' + minSize + '"/><input id="maxSize" name="commercial.maxSize" class="search-filter-shorttext" title="max" type="text" value="' + maxSize + '"/>' +
		'</div>';
	if ( showLocationFilter )
		$('#attributes2').html(str).show();
	else
		$('#attributes1').after(str);
	$('.attributes input:text').inputFields();
}
function show_HOUSE(bedrooms,bathrooms) {
	var str = '<div id="ui-search-bedrooms" class="ui-search-filter attributes">' +
    '<a style="width:70px;" tabindex="0" class="ui-selectmenu xsp" href="#"></a>' +
    '<input type="hidden" name="house.noOfBedrooms" value=""/>' +
    '</div>' + 
	'<div id="ui-search-bathrooms" class="ui-search-filter attributes">' +
    '<a style="width:80px" tabindex="0" class="ui-selectmenu xsp" href="#"></a>' +
    '<input type="hidden" name="house.noOfBathrooms" value=""/>' +
    '</div>'
	if ( showLocationFilter )
		$('#attributes2').html(str).show();
	else
		$('#attributes1').after(str);
    $('#ui-search-bedrooms a').popupMenu(bedroomMenuOption,bedrooms);
    $('#ui-search-bathrooms a').popupMenu(bathroomMenuOption,bathrooms);
	$('.attributes input:text').inputFields();
}
function show_PRICE() {
	if ( $('#price').length == 0 ) {
		var str = '<div class="ui-search-filter" id="price">' +
		'<label for="search-filter-min">Price </label><input id="minPrice" name="minPrice" class="search-filter-shorttext" title="min" type="text" value=""/><input id="maxPrice" name="maxPrice" class="search-filter-shorttext" title="max" type="text" value=""/></div>';
		$(str).insertBefore('#search-filters div:first');
		$('#price input:text').inputFields();
	}
}
function setupGoogleAfs(clientId,channel,n,q,locale,adTest,adSafe,page) {
    if ( n < 1 ) return;
	google_afs_ad = 'n' + n;
	google_afs_adpage = page;
	google_afs_query = q;
	if ( channel ) {
		google_afs_channel = channel;
	} 
	google_afs_ie = "utf8";
	google_afs_oe = "utf8";
	if ( adTest )
		google_afs_adtest = 'on';
	google_afs_adsafe = adSafe;
	google_afs_hl = locale.substring(0,2);
	google_afs_gl = locale.substring(3);
    google_afs_client = clientId;

	document.writeln('<script language="JavaScript" src="http://www.google.com/afsonline/show_afs_ads.js"></script>');
}
function setupGoogleAfc(clientId,channel,n,hints,locale,adTest,adSafe,page) {
    google_max_num_ads = n;
	if ( hints )
		google_hints = hints;
	if ( channel )
		google_ad_channel = channel; 
    google_ad_output = 'js';
	google_encoding = "utf8";
	if ( adTest )
		google_adtest = 'on';
	google_safe = adSafe;
	google_language = locale.substring(0,2);

	google_ad_client = clientId;
	document.writeln('<script language="JavaScript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>');

}
function google_afs_request_done(google_ads){
	if ( google_ads.length > 0 && google_ad_request_done )
		google_ad_request_done(google_ads);
}
function trackClick(trackerurl) {
	if (trackerurl!="undefined" && trackerurl) 
		(new Image).src='http://altfarm.mediaplex.com/ad/bk/'+trackerurl;
	return true;
}

function SBStyleA(google_ads,mplx){
	var str = '<li class="title"><span class="sponsoredLinks">Sponsored Links</span></li>';
    for(var i=0; i < google_ads.length; i++){
    	var a = '<a class="t" href="' + google_ads[i].url + '" target="_blank" onclick="return trackClick(\'' + mplx + '\');"' + 
			' onmouseout="window.status=\'\'" ' + 'onmouseover="window.status=\'go to ' + google_ads[i].visible_url + '\'; return true;" ' + 'xstyle="text-decoration:none">'; 
    	str += '<li><span class="adsenseLine1">' + a + google_ads[i].line1 + '</a></span><br/>' +
        '<span class="adsenseContent">' + a + google_ads[i].line2 + ' ' + google_ads[i].line3 + '</a></span><br/>' +
        '<span class="adsenseUrl">' + a + google_ads[i].visible_url + '</a></span>' +
    	'</li>';
    }
	if ( str ) {
		$('#bottomAdSense').html(str).show();
	}

}
function VAStyleA(google_ads,mplx){
	SBStyleA(google_ads,mplx);
}
/**** Webtrend codes ***/
var gService = false;
var gTimeZone = 1;
// Code section for Enable First-Party Cookie Tracking
function dcsCookie(){
    if (typeof(dcsOther)=="function"){
        dcsOther();
    }
    else if (typeof(dcsPlugin)=="function"){
        dcsPlugin();
    }
    else if (typeof(dcsFPC)=="function"){
        dcsFPC(gTimeZone);
    }
}
function dcsGetCookie(name){
    var pos=document.cookie.indexOf(name+"=");
    if (pos!=-1){
        var start=pos+name.length+1;
        var end=document.cookie.indexOf(";",start);
        if (end==-1){
            end=document.cookie.length;
        }
        return unescape(document.cookie.substring(start,end));
    }
    return null;
}
function dcsGetCrumb(name,crumb){
    var aCookie=dcsGetCookie(name).split(":");
    for (var i=0;i<aCookie.length;i++){
        var aCrumb=aCookie[i].split("=");
        if (crumb==aCrumb[0]){
            return aCrumb[1];
        }
    }
    return null;
}
function dcsGetIdCrumb(name,crumb){
    var cookie=dcsGetCookie(name);
    var id=cookie.substring(0,cookie.indexOf(":lv="));
    var aCrumb=id.split("=");
    for (var i=0;i<aCrumb.length;i++){
        if (crumb==aCrumb[0]){
            return aCrumb[1];
        }
    }
    return null;
}
function dcsFPC(offset){
    if (typeof(offset)=="undefined"){
        return;
    }
    var name=gFpc;
    var dCur=new Date();
    dCur.setTime(dCur.getTime()+(dCur.getTimezoneOffset()*60000)+(offset*3600000));
    var dExp=new Date(dCur.getTime()+315360000000);
    var dSes=new Date(dCur.getTime());
    if (document.cookie.indexOf(name+"=")!=-1){
        var id=dcsGetIdCrumb(name,"id");
        var lv=parseInt(dcsGetCrumb(name,"lv"));
        var ss=parseInt(dcsGetCrumb(name,"ss"));
        if ((id==null)||(id=="null")||isNaN(lv)||isNaN(ss)){
            return;
        }
        WT.co_f=id;
        var dLst=new Date(lv);
        dSes.setTime(ss);
        if ((dCur.getTime()>(dLst.getTime()+1800000))||(dCur.getTime()>(dSes.getTime()+28800000))){
            dSes.setTime(dCur.getTime());
            WT.vt_f_s="1";
        }
        if ((dCur.getDay()!=dLst.getDay())||(dCur.getMonth()!=dLst.getMonth())||(dCur.getYear()!=dLst.getYear())){
            WT.vt_f_d="1";
        }
    }
    else{
        var tmpname=name+"_TMP=";
        document.cookie=tmpname+"1";
        if (document.cookie.indexOf(tmpname)!=-1){
            document.cookie=tmpname+"; expires=Thu, 01-Jan-1970 00:00:01 GMT";
            if ((typeof(gWtId)!="undefined")&&(gWtId!="")){
                WT.co_f=gWtId;
            }
            else if ((typeof(gTempWtId)!="undefined")&&(gTempWtId!="")){
                WT.co_f=gTempWtId;
                WT.vt_f="1";
            }
            else{
                WT.co_f="2";
                var cur=dCur.getTime().toString();
                for (var i=2;i<=(32-cur.length);i++){
                    WT.co_f+=Math.floor(Math.random()*16.0).toString(16);
                }
                WT.co_f+=cur;
                WT.vt_f="1";
            }
            if (typeof(gWtAccountRollup)=="undefined"){
                WT.vt_f_a="1";
            }
            WT.vt_f_s="1";
            WT.vt_f_d="1";
        }
        else{
            WT.vt_f="2";
            WT.vt_f_a="2";
            return;
        }
    }
    WT.co_f=escape(WT.co_f);
    WT.vt_sid=WT.co_f+"."+dSes.getTime();
    var expiry="; expires="+dExp.toGMTString();
    document.cookie=name+"="+"id="+WT.co_f+":lv="+dCur.getTime().toString()+":ss="+dSes.getTime().toString()+expiry+"; path=/"+(((typeof(gFpcDom)!="undefined")&&(gFpcDom!=""))?("; domain="+gFpcDom):(""));
}

// Code section for Use the new first-party cookie generated with this tag.
var gFpc="WT_FPC";
var gWtId="";
var gTempWtId="";
var gConvert=true;

function dcsAdv(){
    dcsFunc("dcsET");
    dcsFunc("dcsCookie");
    dcsFunc("dcsAdSearch");
    dcsFunc("dcsTP");
}

var gVersion="1.0";
var RE={"%09":/\t/g,"%20":/ /g,"%23":/\#/g,"%26":/\&/g,"%2B":/\+/g,"%3F":/\?/g,"%5C":/\\/g};
var gImages=new Array;
var gIndex=0;
var DCS=new Object();
var WT=new Object();
var DCSext=new Object();
DCSext.origpage = null;
var gQP=new Array();

var gDomain="statse.webtrendslive.com";

function dcsVar(){
    var dCurrent=new Date();
    WT.tz=dCurrent.getTimezoneOffset()/60*-1;
    if (WT.tz==0){
        WT.tz="0";
    }
    WT.bh=dCurrent.getHours();
    WT.ul=navigator.appName=="Netscape"?navigator.language:navigator.userLanguage;
    if (typeof(screen)=="object"){
        WT.cd=navigator.appName=="Netscape"?screen.pixelDepth:screen.colorDepth;
        WT.sr=screen.width+"x"+screen.height;
    }
    if (typeof(navigator.javaEnabled())=="boolean"){
        WT.jo=navigator.javaEnabled()?"Yes":"No";
    }
    if (document.title){
        WT.ti=document.title;
    }
    WT.js="Yes";
    if (typeof(gVersion)!="undefined"){
        WT.jv=gVersion;
    }
    if (document.body&&document.body.addBehavior){
	try {
        document.body.addBehavior("#default#clientCaps");
        if (document.body.connectionType){
            WT.ct=document.body.connectionType;
        }
        document.body.addBehavior("#default#homePage");
        WT.hp=document.body.isHomePage(location.href)?"1":"0";
	} catch(ex) {}
    }
    if (parseInt(navigator.appVersion)>3){
        if ((navigator.appName=="Microsoft Internet Explorer")&&document.body){
            WT.bs=document.body.offsetWidth+"x"+document.body.offsetHeight;
        }
        else if (navigator.appName=="Netscape"){
            WT.bs=window.innerWidth+"x"+window.innerHeight;
        }
    }
    WT.fi="No";
    if (window.ActiveXObject){
        if ((typeof(gFV)!="undefined")&&(gFV.length>0)){
            WT.fi="Yes";
            WT.fv=gFV;
        }
    }
    else if (navigator.plugins&&navigator.plugins.length){
        for (var i=0;i<navigator.plugins.length;i++){
            if (navigator.plugins[i].name.indexOf('Shockwave Flash')!=-1){
                WT.fi="Yes";
                WT.fv=navigator.plugins[i].description.split(" ")[2];
                break;
            }
        }
    }
    WT.sp="@@SPLITVALUE@@";
    DCS.dcsdat=dCurrent.getTime();
    DCS.dcssip=window.location.hostname;
    DCS.dcsuri=window.location.pathname;
    if (window.location.search){
        DCS.dcsqry=window.location.search;
        if (gQP.length>0){
            for (var i=0;i<gQP.length;i++){
                var pos=DCS.dcsqry.indexOf(gQP[i]);
                if (pos!=-1){
                    var front=DCS.dcsqry.substring(0,pos);
                    var end=DCS.dcsqry.substring(pos+gQP[i].length,DCS.dcsqry.length);
                    DCS.dcsqry=front+end;
                }
            }
        }
    }
    if ((window.document.referrer!="")&&(window.document.referrer!="-")){
        if (!(navigator.appName=="Microsoft Internet Explorer"&&parseInt(navigator.appVersion)<4)){
            DCS.dcsref=window.document.referrer;
        }
    }
}

function A(N,V){
    return "&"+N+"="+dcsEscape(V);
}

function dcsEscape(S){
    if (typeof(RE)!="undefined"){
        var retStr = new String(S);
        for (R in RE){
            retStr = retStr.replace(RE[R],R);
        }
        return retStr;
    }
    else{
        return escape(S);
    }
}

function dcsCreateImage(dcsSrc){
    if (document.images){
        gImages[gIndex]=new Image;
        if ((typeof(gHref)!="undefined")&&(gHref.length>0)){
            gImages[gIndex].onload=gImages[gIndex].onerror=dcsLoadHref;
        }
        gImages[gIndex].src=dcsSrc;
        gIndex++;
    }
    else{
        document.write('<IMG BORDER="0" NAME="DCSIMG" WIDTH="1" HEIGHT="1" SRC="'+dcsSrc+'">');
    }
}

function dcsMeta(){
    var elems;
    if (document.all){
        elems=document.all.tags("meta");
    }
    else if (document.documentElement){
        elems=document.getElementsByTagName("meta");
    }
    if (typeof(elems)!="undefined"){
        for (var i=1;i<=elems.length;i++){
            var meta=elems.item(i-1);
            if (meta.name){
                if (meta.name.indexOf('WT.')==0){
                    WT[meta.name.substring(3)]=meta.content;
                }
                else if (meta.name.indexOf('DCSext.')==0){
                    DCSext[meta.name.substring(7)]=meta.content;
                }
                else if (meta.name.indexOf('DCS.')==0){
                    DCS[meta.name.substring(4)]=meta.content;
                }
            }
        }
    }
}

function dcsTag(domain, dcsId){
    var P="http"+(window.location.protocol.indexOf('https:')==0?'s':'')+"://"+domain+(dcsId==""?'':'/'+dcsId)+"/dcs.gif?";
    for (N in DCS){
        if (DCS[N]) {
            P+=A(N,DCS[N]);
        }
    }
    for (N in WT){
        if (WT[N]) {
            P+=A("WT."+N,WT[N]);
        }
    }
    for (N in DCSext){
        if (DCSext[N]) {
            P+=A(N,DCSext[N]);
        }
    }
    if (P.length>2048&&navigator.userAgent.indexOf('MSIE')>=0){
        P=P.substring(0,2040)+"&WT.tu=1";
    }
    dcsCreateImage(P);
}

function dcsFunc(func){
    if (typeof(window[func])=="function"){
        window[func]();
    }
}

function dcsMultiTrack(){
    if (arguments.length%2==0) {
        for (var i = 0; i < arguments.length; i+=2){
            if (arguments[i].indexOf('WT.')==0){
                WT[arguments[i].substring(3)]=arguments[i+1];
            }
            else if (arguments[i].indexOf('DCS.')==0){
                DCS[arguments[i].substring(4)]=arguments[i+1];
            }
            else if (arguments[i].indexOf('DCSext.')==0){
                var name = arguments[i].substring(7);
                DCSext[name]=arguments[i+1];
                if ( name == "page")
                	DCSext.origpage=arguments[i+1];
            }
        }
        var dCurrent=new Date();
        DCS.dcsdat=dCurrent.getTime();
        dcsFunc("dcsCookie");
        if (eclLucky()) {
            dcsTag(gDomain, gDcsId);
        }
    }
}

function eclGetQuery() {
	var res = null;
	var inp = ""+document.URL;
	var indx = inp.lastIndexOf("/");
	if (indx > 0) {
		indx = inp.indexOf("?", indx);
		if (indx > 0) {
			res = inp.substring(indx+1);
		} else {
			indx = inp.indexOf("W0QQ", indx);
			if (indx>0) {
				inp = inp.substring(indx+4);
				res = inp.replace(/QQ/g, "&").replace(/Z/g, "=");
			}
		}
	}
	if (res)
		res = res.replace(/Page=/g, "PageZ=");

	return res;
}
function eclMods(){
    if (document.title){
        WT.ti=escape(document.title);
    }
    if (typeof(DCSext.page)!="undefined"){
        DCS.dcsuri='/'+DCSext.page;
    }else if (DCS.dcsuri){
        DCSext.page=DCS.dcsuri.substr(1,DCS.dcsuri.length-1);
    }
    if (DCS.dcsref) {
		DCS.dcsref=DCS.dcsref.replace(/(http:\/\/.*?\.(kijiji|gumtree|ebayclassifieds)\..*?)\/.*/,'$1');
    }
    var kjj_query = eclGetQuery();
    if (kjj_query)
        DCS.dcsqry=kjj_query;
}

function eclLucky() {
    var cn = 'luckynumber';
    ln = dcsGetCookie(cn);
    if (ln == null) {
        ln = Math.floor(Math.random()*1000000);
        var date = new Date();
        date.setTime(date.getTime()+(30*24*60*60*1000));
        document.cookie = cn+"="+ln+"; expires="+date.toGMTString()+"; path=/; domain="+gCookieDomain+";";
    }
    return ((ln % 1000) < 100);
}
function wtExternalPage(pageName){
	if ( DCSext.origpage == null )
		DCSext.origpage = DCSext.page;
	DCSext.page = pageName + "-" + DCSext.origpage;
	eclMods();
	dcsTag(gDomain, gDcsId);
}

function initWebTrend() {
	if ((document.cookie.indexOf("WT_FPC=")==-1)&&(document.cookie.indexOf("WTLOPTOUT=")==-1)) {
        var url = "http"+(window.location.protocol.indexOf('https:')==0?'s':'')+"://"+gDomain+"/"+gDcsId+"/wtid.js";
		$(document).executeOnce('webtrend',2000, function(){
			$.getScript(url,doWebTrend);
		});
	} else {
		doWebTrend();
	}
}
function doWebTrend() {
	dcsVar();
	dcsMeta();
	dcsFunc("dcsAdv");
	eclMods();
	if (eclLucky()) {
		dcsTag(gDomain, gDcsId);
		$('.twitter').click(function(){
			wtExternalPage('twitter');
		});
		$('.facebook').click(function(){
			wtExternalPage('facebook');
		});
	}
}

function headerGreetings() {
	var level = $.cookielet('a', 'l');
	if ( level && $.base64Decode(level) == '1' ) {
		var userName = $.cookielet('a', 'n');
		if ((userName == null)||(userName == '')) {
			userName = $.cookielet('a', 'u');
		}
		userName = $.base64Decode(userName);
		var idx = userName.indexOf("@");
		if ( idx > 0 ) userName = userName.substring(0,idx);
		if ( userName.length > 20 ) {
			userName = userName.substring(0,18) + "...";
		}
		$('#link-managemyads').after('<div id="hello"><span>Hi ' + userName + ' </span><a href="/m/SignOut">Sign out</a> </div>');
	}
}
