GLOBRIX=GLOBRIX||{};GLOBRIX.AreaGuide=function(args){var f=this;this.latitude=args.lat;this.longitude=args.lng;this.position=new google.maps.LatLng(this.latitude,this.longitude);this.centerIcon=new google.maps.Icon();this.centerIcon.image=(args.centerImage===undefined)?'':args.centerImage;this.centerIcon.iconSize=new google.maps.Size(16,16);this.centerIcon.iconAnchor=new google.maps.Point(8,8);this.pageCategory=args.pageCategory;this.property=args.property;this.gardenCentresPin=args.gardenCentresPin;this.parkingPin=args.parkingPin;this.pubsPin=args.pubsPin;this.recentlySoldPin=args.recentlySoldPin;this.restaurantsPin=args.restaurantsPin;this.schoolsPin=args.schoolsPin;this.sevicesPin=args.sevicesPin;this.shoppingPin=args.shoppingPin;this.sportPin=args.sportPin;this.transportPin=args.transportPin;this.markerMap={'garden_centres':[],'parking':[],'pubs':[],'recently_sold':[],'restaurants':[],'schools':[],'services':[],'shopping':[],'sports':[],'transport':[]};};GLOBRIX.AreaGuide.prototype.mapView=function(){var f=this;var mapLoaded=false;var canvas;if($('map_tab')){$('map_tab').show();}
if(Control.Tabs){Control.Tabs.observe('afterChange',function(tabs,oldContainer){if(oldContainer.id==="hit_maps"){if(mapLoaded){canvas.checkResize();}else{canvas=new google.maps.Map2($('mapview_canvas'));canvas.setCenter(f.position,16);canvas.addOverlay(new google.maps.Marker(f.position,{icon:f.centerIcon,clickable:false,zIndexProcess:function(m,b){return 1;}}));canvas.addControl(new google.maps.LargeMapControl3D());canvas.addControl(new google.maps.MapTypeControl());canvas.disableScrollWheelZoom();google.maps.Event.addListener(canvas,"error",function(){$('map_tab').hide();return;});mapLoaded=true;}}});}
$$('ul#map_legend li input').each(function(control){Event.observe(control,'click',function(){switch(control.value){case"parking":toggleMarkers("parking",f.parkingPin,control.checked,false);break;case"pubs":toggleMarkers("pubs",f.pubsPin,control.checked,true);break;case"restaurants":toggleMarkers("restaurants",f.restaurantsPin,control.checked,true);break;case"schools":toggleMarkers("schools",f.schoolsPin,control.checked,true);break;case"services":toggleMarkers("services",f.sevicesPin,control.checked,true);break;case"shopping":toggleMarkers("shopping",f.shoppingPin,control.checked,true);break;case"transport":toggleMarkers("transport",f.transportPin,control.checked,false);break;case"sports":toggleMarkers("sports",f.sportPin,control.checked,false);break;case"garden-centres":toggleMarkers("garden_centres",f.gardenCentresPin,control.checked,true);break;case"recently-sold":toggleMarkers("recently_sold",f.recentlySoldPin,control.checked,true);break;}});});var toggleMarkers=function(label,image,togglePins,showPopup){if(togglePins){if(f.markerMap[label].length===0){loadMarkers(label,image,showPopup);}else{f.markerMap[label].each(function(marker){marker.show();});}}else{f.markerMap[label].each(function(marker){marker.hide();});}};var loadMarkers=function(label,image,showPopup){var ajax=new Ajax.Request(["/area_guide/get_",label,"?lat=",f.latitude,"&lon=",f.longitude,"&format=json"].join(""),{method:'get',onLoading:function(){$('map_loader').show();},onSuccess:function(transport){transport.responseText.evalJSON(true).each(function(item){var pin=new google.maps.Icon();pin.image=image;pin.iconSize=new google.maps.Size(20,23);pin.iconAnchor=new google.maps.Point(10,23);var pinPosition=new google.maps.LatLng(item.latitude,item.longitude);var pinMarker=new google.maps.Marker(pinPosition,{icon:pin,title:item.name,clickable:showPopup});canvas.addOverlay(pinMarker);if(showPopup){google.maps.Event.addListener(pinMarker,"click",function(){var ajax=new Ajax.Request(["/area_guide/show_",label,"?id=",item.id].join(""),{method:'get',onLoading:function(){$('map_loader').show();},onSuccess:function(transport){var content=['<div class="map-bubble" style="width:500px;max-height:300px;margin:0;overflow:auto;padding:0 2px;">',transport.responseText,'</div>'].join("");canvas.openInfoWindowHtml(pinPosition,content);$('map_loader').hide();}});});}
f.markerMap[label].push(pinMarker);});$('map_loader').hide();}});};};GLOBRIX.AreaGuide.prototype.streetView=function(){var f=this;var canvas=new GStreetviewPanorama($('streetview_canvas'));canvas.setLocationAndPOV(f.position);google.maps.Event.addListener(canvas,"error",function(){$('street_view_tab').hide();return;});if($('street_view_tab')){$('street_view_tab').show();}
if(Control.Tabs){Control.Tabs.observe('afterChange',function(tabs,oldContainer){if(oldContainer.id==="hit_street_view"){canvas.checkResize();}});}};GLOBRIX.AreaGuide.prototype.recentlySold=function(renderCanvas){var f=this;var mapLoaded=false;var markersLoaded=false;var canReload=true;var dateRange="3";var canvas;if($('recently_sold_tab')){$('recently_sold_tab').show();}
if(Control.Tabs){Control.Tabs.observe('afterChange',function(tabs,oldContainer){if(oldContainer.id==="hit_recently_sold"){if(mapLoaded){canvas.checkResize();if(!markersLoaded){loadMarkers(f.recentlySoldPin);}}else{mapLoaded=loadMap();}}});}
$$('#recently_sold_length a').each(function(button){button.observe('click',function(e){var el=Event.element(e);if(!el.hasClassName("selected")){$$('#recently_sold_length a.selected').each(function(link){link.removeClassName('selected');});el.addClassName('selected');dateRange=el.name;loadMarkers(f.recentlySoldPin);}
return false;});});var loadMap=function(){canvas=new google.maps.Map2($('recently_sold_canvas'));canvas.setCenter(f.position,16);canvas.addOverlay(new google.maps.Marker(f.position,{icon:f.centerIcon,clickable:false,zIndexProcess:function(m,b){return 1;}}));canvas.addControl(new google.maps.LargeMapControl3D());google.maps.Event.addListener(canvas,"error",function(){$('recently_sold_tab').hide();return;});google.maps.Event.addListener(canvas,"infowindowopen",function(){canReload=false;});google.maps.Event.addListener(canvas,"infowindowclose",function(){canReload=true;});google.maps.Event.addListener(canvas,"moveend",function(){if(markersLoaded&&canReload){loadMarkers(f.recentlySoldPin);}});loadMarkers(f.recentlySoldPin);return true;};var loadMarkers=function(image){var url=["/area_guide/get_recently_sold?lat=",canvas.getCenter().lat(),"&lon=",canvas.getCenter().lng(),"&range=",dateRange,"&format=json"].join("");var ajax=new Ajax.Request(url,{method:'get',onLoading:function(){$('recently_sold_loader').show();},onSuccess:function(transport){canvas.clearOverlays();canvas.addOverlay(new google.maps.Marker(f.position,{icon:f.centerIcon,clickable:false,zIndexProcess:function(m,b){return 1;}}));transport.responseText.evalJSON(true).each(function(item){var pin=new google.maps.Icon();pin.image=image;pin.iconSize=new google.maps.Size(20,23);pin.iconAnchor=new google.maps.Point(10,23);var pinPosition=new google.maps.LatLng(item.latitude,item.longitude);var pinMarker=new google.maps.Marker(pinPosition,{icon:pin,title:[item.property_count,"properties at",item.name].join(" ")});canvas.addOverlay(pinMarker);google.maps.Event.addListener(pinMarker,"click",function(){var ajax=new Ajax.Request(["/area_guide/get_recently_sold","?ids=",item.property_list,"&lat=",item.latitude,"&lon=",item.longitude,"&loc=",item.name,"&range=",dateRange,"&format=html"].join(""),{method:'get',onLoading:function(){$('recently_sold_loader').show();},onSuccess:function(transport){var content=['<div class="map-bubble" style="width:500px;max-height:300px;margin:10px 0;overflow:auto;padding:0 2px;position:relative;">',transport.responseText,'</div>'].join("");canvas.openInfoWindowHtml(pinPosition,content);$('recently_sold_loader').hide();}});});});$('recently_sold_loader').hide();markersLoaded=true;}});};if(renderCanvas||$('hit_recently_sold').visible()){mapLoaded=loadMap();}};GLOBRIX.AreaGuide.prototype.photo=function(src){var image=new Image();image.src=src;image.onload=function(){$('hit_main_image').setStyle({backgroundImage:'url('+src+')'});$('hit_main_image_container').setStyle({width:image.width+'px',height:image.height+'px'});};};GLOBRIX.AreaGuide.prototype.carousel=function(url,loc,pt){var f=this;var populate=function(container,sort){var carouselUrl=[url,"?sb=",sort,"&lat=",f.latitude,"&lon=",f.longitude,"&loc=",loc,"&property_type=",pt,"&format=json"].join("");var carouselProperties=new UI.Ajax.Carousel(container.id,{url:carouselUrl,elementSize:109}).observe("request:started",function(){$('properties_indicator').show().morph('opacity:0.8',{duration:0.5});}).observe("request:ended",function(){$('properties_indicator').morph('opacity:0',{duration:0.5,afterFinish:function(obj){obj.element.hide();}});}).observe("scroll:ended",function(){pageTracker._trackEvent(f.pageCategory,'carousel:scroll',sort);});};var tabs=new Control.Tabs('properties_tab_nav',{setClassOnContainer:true,activeClassName:'current',afterChange:function(container){if($$(['#',container.id,' div.container ul'].join(""))[0].innerHTML.length===0){switch(container.id){case"properties_most_expensive":populate(container,"mostexpensive");break;case"properties_least_expensive":populate(container,"leastexpensive");break;case"properties_most_bedrooms":populate(container,"mostbed");break;default:populate(container,"mostrecent");}}}});};var pagination_container;function tabHighlight(el,method){selected=$(el).up();selected.siblings().invoke('removeClassName','selected');selected.addClassName('selected');target=$(method);target_class="."+target.className;$$(target_class).invoke('hide');target.show();return false;}
function setPaginationContainer(el){pagination_container=$(el).up('div:not([class~=pagination])');}
function addAjaxPaginationIcon(){pagination_container.immediateDescendants().invoke('setOpacity','0');pagination_container.addClassName('ajax-pending');}
function removeAjaxPaginationIcon(){pagination_container.immediateDescendants().invoke('setOpacity','1');pagination_container.removeClassName('ajax-pending');}
if(typeof(Control)=='undefined')
Control={};var $proc=function(proc){return typeof(proc)=='function'?proc:function(){return proc};};var $value=function(value){return typeof(value)=='function'?value():value;};Object.Event={extend:function(object){object._objectEventSetup=function(event_name){this._observers=this._observers||{};this._observers[event_name]=this._observers[event_name]||[];};object.observe=function(event_name,observer){if(typeof(event_name)=='string'&&typeof(observer)!='undefined'){this._objectEventSetup(event_name);if(!this._observers[event_name].include(observer))
this._observers[event_name].push(observer);}else
for(var e in event_name)
this.observe(e,event_name[e]);};object.stopObserving=function(event_name,observer){this._objectEventSetup(event_name);if(event_name&&observer)
this._observers[event_name]=this._observers[event_name].without(observer);else if(event_name)
this._observers[event_name]=[];else
this._observers={};};object.observeOnce=function(event_name,outer_observer){var inner_observer=function(){outer_observer.apply(this,arguments);this.stopObserving(event_name,inner_observer);}.bind(this);this._objectEventSetup(event_name);this._observers[event_name].push(inner_observer);};object.notify=function(event_name){this._objectEventSetup(event_name);var collected_return_values=[];var args=$A(arguments).slice(1);try{for(var i=0;i<this._observers[event_name].length;++i)
collected_return_values.push(this._observers[event_name][i].apply(this._observers[event_name][i],args)||null);}catch(e){if(e==$break)
return false;else
throw e;}
return collected_return_values;};if(object.prototype){object.prototype._objectEventSetup=object._objectEventSetup;object.prototype.observe=object.observe;object.prototype.stopObserving=object.stopObserving;object.prototype.observeOnce=object.observeOnce;object.prototype.notify=function(event_name){if(object.notify){var args=$A(arguments).slice(1);args.unshift(this);args.unshift(event_name);object.notify.apply(object,args);}
this._objectEventSetup(event_name);var args=$A(arguments).slice(1);var collected_return_values=[];try{if(this.options&&this.options[event_name]&&typeof(this.options[event_name])=='function')
collected_return_values.push(this.options[event_name].apply(this,args)||null);for(var i=0;i<this._observers[event_name].length;++i)
collected_return_values.push(this._observers[event_name][i].apply(this._observers[event_name][i],args)||null);}catch(e){if(e==$break)
return false;else
throw e;}
return collected_return_values;};}}};Element.addMethods({observeOnce:function(element,event_name,outer_callback){var inner_callback=function(){outer_callback.apply(this,arguments);Element.stopObserving(element,event_name,inner_callback);};Element.observe(element,event_name,inner_callback);}});Object.extend(Event,(function(){var cache=Event.cache;function getEventID(element){if(element._prototypeEventID)return element._prototypeEventID[0];arguments.callee.id=arguments.callee.id||1;return element._prototypeEventID=[++arguments.callee.id];}
function getDOMEventName(eventName){if(eventName&&eventName.include(':'))return"dataavailable";if(!Prototype.Browser.IE){eventName={mouseenter:'mouseover',mouseleave:'mouseout'}[eventName]||eventName;}
return eventName;}
function getCacheForID(id){return cache[id]=cache[id]||{};}
function getWrappersForEventName(id,eventName){var c=getCacheForID(id);return c[eventName]=c[eventName]||[];}
function createWrapper(element,eventName,handler){var id=getEventID(element);var c=getWrappersForEventName(id,eventName);if(c.pluck("handler").include(handler))return false;var wrapper=function(event){if(!Event||!Event.extend||(event.eventName&&event.eventName!=eventName))
return false;Event.extend(event);handler.call(element,event);};if(!(Prototype.Browser.IE)&&['mouseenter','mouseleave'].include(eventName)){wrapper=wrapper.wrap(function(proceed,event){var rel=event.relatedTarget;var cur=event.currentTarget;if(rel&&rel.nodeType==Node.TEXT_NODE)
rel=rel.parentNode;if(rel&&rel!=cur&&!rel.descendantOf(cur))
return proceed(event);});}
wrapper.handler=handler;c.push(wrapper);return wrapper;}
function findWrapper(id,eventName,handler){var c=getWrappersForEventName(id,eventName);return c.find(function(wrapper){return wrapper.handler==handler});}
function destroyWrapper(id,eventName,handler){var c=getCacheForID(id);if(!c[eventName])return false;c[eventName]=c[eventName].without(findWrapper(id,eventName,handler));}
function destroyCache(){for(var id in cache)
for(var eventName in cache[id])
cache[id][eventName]=null;}
if(window.attachEvent){window.attachEvent("onunload",destroyCache);}
return{observe:function(element,eventName,handler){element=$(element);var name=getDOMEventName(eventName);var wrapper=createWrapper(element,eventName,handler);if(!wrapper)return element;if(element.addEventListener){element.addEventListener(name,wrapper,false);}else{element.attachEvent("on"+name,wrapper);}
return element;},stopObserving:function(element,eventName,handler){element=$(element);var id=getEventID(element),name=getDOMEventName(eventName);if(!handler&&eventName){getWrappersForEventName(id,eventName).each(function(wrapper){element.stopObserving(eventName,wrapper.handler);});return element;}else if(!eventName){Object.keys(getCacheForID(id)).each(function(eventName){element.stopObserving(eventName);});return element;}
var wrapper=findWrapper(id,eventName,handler);if(!wrapper)return element;if(element.removeEventListener){element.removeEventListener(name,wrapper,false);}else{element.detachEvent("on"+name,wrapper);}
destroyWrapper(id,eventName,handler);return element;},fire:function(element,eventName,memo){element=$(element);if(element==document&&document.createEvent&&!element.dispatchEvent)
element=document.documentElement;var event;if(document.createEvent){event=document.createEvent("HTMLEvents");event.initEvent("dataavailable",true,true);}else{event=document.createEventObject();event.eventType="ondataavailable";}
event.eventName=eventName;event.memo=memo||{};if(document.createEvent){element.dispatchEvent(event);}else{element.fireEvent(event.eventType,event);}
return Event.extend(event);}};})());Object.extend(Event,Event.Methods);Element.addMethods({fire:Event.fire,observe:Event.observe,stopObserving:Event.stopObserving});Object.extend(document,{fire:Element.Methods.fire.methodize(),observe:Element.Methods.observe.methodize(),stopObserving:Element.Methods.stopObserving.methodize()});(function(){function wheel(event){var delta;if(event.wheelDelta)
delta=event.wheelDelta/120;else if(event.detail)
delta=-event.detail/3;if(!delta)
return;var custom_event=Event.element(event).fire('mouse:wheel',{delta:delta});if(custom_event.stopped){Event.stop(event);return false;}}
document.observe('mousewheel',wheel);document.observe('DOMMouseScroll',wheel);})();var IframeShim=Class.create({initialize:function(){this.element=new Element('iframe',{style:'position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);display:none',src:'javascript:void(0);',frameborder:0});$(document.body).insert(this.element);},hide:function(){this.element.hide();return this;},show:function(){this.element.show();return this;},positionUnder:function(element){var element=$(element);var offset=element.cumulativeOffset();var dimensions=element.getDimensions();this.element.setStyle({left:offset[0]+'px',top:offset[1]+'px',width:dimensions.width+'px',height:dimensions.height+'px',zIndex:element.getStyle('zIndex')-1}).show();return this;},setBounds:function(bounds){for(prop in bounds)
bounds[prop]+='px';this.element.setStyle(bounds);return this;},destroy:function(){if(this.element)
this.element.remove();return this;}});if(typeof(Prototype)=="undefined"){throw"Control.Tabs requires Prototype to be loaded.";}
if(typeof(Object.Event)=="undefined"){throw"Control.Tabs requires Object.Event to be loaded.";}
Control.Tabs=Class.create({initialize:function(tab_list_container,options){if(!$(tab_list_container)){throw"Control.Tabs could not find the element: "+tab_list_container;}
this.activeContainer=false;this.activeLink=false;this.containers=$H({});this.links=[];Control.Tabs.instances.push(this);this.options={beforeChange:Prototype.emptyFunction,afterChange:Prototype.emptyFunction,hover:false,linkSelector:'li a',setClassOnContainer:false,activeClassName:'active',defaultTab:'first',autoLinkExternal:true,targetRegExp:/#(.+)$/,showFunction:Element.show,hideFunction:Element.hide};Object.extend(this.options,options||{});(typeof(this.options.linkSelector=='string')?$(tab_list_container).select(this.options.linkSelector):this.options.linkSelector($(tab_list_container))).findAll(function(link){return(/^#/).exec((Prototype.Browser.WebKit?decodeURIComponent(link.href):link.href).replace(window.location.href.split('#')[0],''));}).each(function(link){this.addTab(link);}.bind(this));this.containers.values().each(Element.hide);if(this.options.defaultTab=='first'){this.setActiveTab(this.links.first());}else if(this.options.defaultTab=='last'){this.setActiveTab(this.links.last());}else{this.setActiveTab(this.options.defaultTab);}
var targets=this.options.targetRegExp.exec(window.location);if(targets&&targets[1]){targets[1].split(',').each(function(target){this.setActiveTab(this.links.find(function(link){return link.key==target;}));}.bind(this));}
if(this.options.autoLinkExternal){$A(document.getElementsByTagName('a')).each(function(a){if(!this.links.include(a)){var clean_href=a.href.replace(window.location.href.split('#')[0],'');if(clean_href.substring(0,1)=='#'){if(this.containers.keys().include(clean_href.substring(1))){$(a).observe('click',function(event,clean_href){this.setActiveTab(clean_href.substring(1));}.bindAsEventListener(this,clean_href));}}}}.bind(this));}},addTab:function(link){this.links.push(link);link.key=link.getAttribute('href').replace(window.location.href.split('#')[0],'').split('#').last().replace(/#/,'');var container=$(link.key);if(!container){throw"Control.Tabs: #"+link.key+" was not found on the page.";}
this.containers.set(link.key,container);link[this.options.hover?'onmouseover':'onclick']=function(link){if(window.event){Event.stop(window.event);}
this.setActiveTab(link);return false;}.bind(this,link);},setActiveTab:function(link){if(!link&&typeof(link)=='undefined'){return;}
if(typeof(link)=='string'){this.setActiveTab(this.links.find(function(_link){return _link.key==link;}));}else if(typeof(link)=='number'){this.setActiveTab(this.links[link]);}else{if(this.notify('beforeChange',this.activeContainer,this.containers.get(link.key))===false){return;}
if(this.activeContainer){this.options.hideFunction(this.activeContainer);}
this.links.each(function(item){(this.options.setClassOnContainer?$(item.parentNode):item).removeClassName(this.options.activeClassName);}.bind(this));(this.options.setClassOnContainer?$(link.parentNode):link).addClassName(this.options.activeClassName);this.activeContainer=this.containers.get(link.key);this.activeLink=link;this.options.showFunction(this.containers.get(link.key));this.notify('afterChange',this.containers.get(link.key));}},next:function(){this.links.each(function(link,i){if(this.activeLink==link&&this.links[i+1]){this.setActiveTab(this.links[i+1]);throw $break;}}.bind(this));},previous:function(){this.links.each(function(link,i){if(this.activeLink==link&&this.links[i-1]){this.setActiveTab(this.links[i-1]);throw $break;}}.bind(this));},first:function(){this.setActiveTab(this.links.first());},last:function(){this.setActiveTab(this.links.last());}});Object.extend(Control.Tabs,{instances:[],findByTabId:function(id){return Control.Tabs.instances.find(function(tab){return tab.links.find(function(link){return link.key==id;});});}});Object.Event.extend(Control.Tabs);if(typeof Prototype=='undefined'||!Prototype.Version.match("1.6"))
throw("Prototype-UI library require Prototype library >= 1.6.0");if(Prototype.Browser.WebKit){Prototype.Browser.WebKitVersion=parseFloat(navigator.userAgent.match(/AppleWebKit\/([\d\.\+]*)/)[1]);Prototype.Browser.Safari2=(Prototype.Browser.WebKitVersion<420);}
if(Prototype.Browser.IE){Prototype.Browser.IEVersion=parseFloat(navigator.appVersion.split(';')[1].strip().split(' ')[1]);Prototype.Browser.IE6=Prototype.Browser.IEVersion==6;Prototype.Browser.IE7=Prototype.Browser.IEVersion==7;}
Prototype.falseFunction=function(){return false};Prototype.trueFunction=function(){return true};var UI={Abstract:{},Ajax:{}};Object.extend(Class.Methods,{extend:Object.extend.methodize(),addMethods:Class.Methods.addMethods.wrap(function(proceed,source){if(!source)return this;if(!source.hasOwnProperty('methodsAdded'))
return proceed(source);var callback=source.methodsAdded;delete source.methodsAdded;proceed(source);callback.call(source,this);source.methodsAdded=callback;return this;}),addMethod:function(name,lambda){var methods={};methods[name]=lambda;return this.addMethods(methods);},method:function(name){return this.prototype[name].valueOf();},classMethod:function(){$A(arguments).flatten().each(function(method){this[method]=(function(){return this[method].apply(this,arguments);}).bind(this.prototype);},this);return this;},undefMethod:function(name){this.prototype[name]=undefined;return this;},removeMethod:function(name){delete this.prototype[name];return this;},aliasMethod:function(newName,name){this.prototype[newName]=this.prototype[name];return this;},aliasMethodChain:function(target,feature){feature=feature.camelcase();this.aliasMethod(target+"Without"+feature,target);this.aliasMethod(target,target+"With"+feature);return this;}});Object.extend(Number.prototype,{snap:function(round){return parseInt(round==1?this:(this/round).floor()*round);}});Object.extend(String.prototype,{camelcase:function(){var string=this.dasherize().camelize();return string.charAt(0).toUpperCase()+string.slice(1);},makeElement:function(){var wrapper=new Element('div');wrapper.innerHTML=this;return wrapper.down();}});Object.extend(Array.prototype,{empty:function(){return!this.length;},extractOptions:function(){return this.last().constructor===Object?this.pop():{};},removeAt:function(index){var object=this[index];this.splice(index,1);return object;},remove:function(object){var index;while((index=this.indexOf(object))!=-1)
this.removeAt(index);return object;},insert:function(index){var args=$A(arguments);args.shift();this.splice.apply(this,[index,0].concat(args));return this;}});Element.addMethods({getScrollDimensions:function(element){return{width:element.scrollWidth,height:element.scrollHeight}},getScrollOffset:function(element){return Element._returnOffset(element.scrollLeft,element.scrollTop);},setScrollOffset:function(element,offset){element=$(element);if(arguments.length==3)
offset={left:offset,top:arguments[2]};element.scrollLeft=offset.left;element.scrollTop=offset.top;return element;},getNumStyle:function(element,style){var value=parseFloat($(element).getStyle(style));return isNaN(value)?null:value;},appendText:function(element,text){element=$(element);text=String.interpret(text);element.appendChild(document.createTextNode(text));return element;}});document.whenReady=function(callback){if(document.loaded)
callback.call(document);else
document.observe('dom:loaded',callback);};Object.extend(document.viewport,{getScrollOffset:document.viewport.getScrollOffsets,setScrollOffset:function(offset){Element.setScrollOffset(Prototype.Browser.WebKit?document.body:document.documentElement,offset);},getScrollDimensions:function(){return Element.getScrollDimensions(Prototype.Browser.WebKit?document.body:document.documentElement);}});(function(){UI.Options={methodsAdded:function(klass){klass.classMethod($w(' setOptions allOptions optionsGetter optionsSetter optionsAccessor '));},setOptions:function(options){if(!this.hasOwnProperty('options'))
this.options=this.allOptions();this.options=Object.extend(this.options,options||{});},allOptions:function(){var superclass=this.constructor.superclass,ancestor=superclass&&superclass.prototype;return(ancestor&&ancestor.allOptions)?Object.extend(ancestor.allOptions(),this.options):Object.clone(this.options);},optionsGetter:function(){addOptionsAccessors(this,arguments,false);},optionsSetter:function(){addOptionsAccessors(this,arguments,true);},optionsAccessor:function(){this.optionsGetter.apply(this,arguments);this.optionsSetter.apply(this,arguments);}};function addOptionsAccessors(receiver,names,areSetters){names=$A(names).flatten();if(names.empty())
names=Object.keys(receiver.allOptions());names.each(function(name){var accessorName=(areSetters?'set':'get')+name.camelcase();receiver[accessorName]=receiver[accessorName]||(areSetters?function(value){return this.options[name]=value}:function(){return this.options[name]});});}})();UI.Carousel=Class.create(UI.Options,{options:{direction:"horizontal",previousButton:".previous_button",nextButton:".next_button",container:".container",scrollInc:"auto",disabledButtonSuffix:'_disabled',overButtonSuffix:'_over'},initialize:function(element,options){this.setOptions(options);this.element=$(element);this.id=this.element.id;this.container=this.element.down(this.options.container).firstDescendant();this.elements=this.container.childElements();this.previousButton=this.options.previousButton==false?null:this.element.down(this.options.previousButton);this.nextButton=this.options.nextButton==false?null:this.element.down(this.options.nextButton);this.posAttribute=(this.options.direction=="horizontal"?"left":"top");this.dimAttribute=(this.options.direction=="horizontal"?"width":"height");this.elementSize=this.computeElementSize();this.nbVisible=this.currentSize()/this.elementSize;var scrollInc=this.options.scrollInc;if(scrollInc=="auto")
scrollInc=Math.floor(this.nbVisible);[this.previousButton,this.nextButton].each(function(button){if(!button)return;var className=(button==this.nextButton?"next_button":"previous_button")+this.options.overButtonSuffix;button.clickHandler=this.scroll.bind(this,(button==this.nextButton?-1:1)*scrollInc*this.elementSize);button.observe("click",button.clickHandler).observe("mouseover",function(){button.addClassName(className)}.bind(this)).observe("mouseout",function(){button.removeClassName(className)}.bind(this));},this);this.updateButtons();},destroy:function($super){[this.previousButton,this.nextButton].each(function(button){if(!button)return;button.stopObserving("click",button.clickHandler);},this);this.element.remove();this.fire('destroyed');},fire:function(eventName,memo){memo=memo||{};memo.carousel=this;return this.element.fire('carousel:'+eventName,memo);},observe:function(eventName,handler){this.element.observe('carousel:'+eventName,handler.bind(this));return this;},stopObserving:function(eventName,handler){this.element.stopObserving('carousel:'+eventName,handler);return this;},checkScroll:function(position,updatePosition){if(position>0)
position=0;else{var limit=this.elements.last().positionedOffset()[this.posAttribute]+this.elementSize;var carouselSize=this.currentSize();if(position+limit<carouselSize)
position+=carouselSize-(position+limit);position=Math.min(position,0);}
if(updatePosition)
this.container.style[this.posAttribute]=position+"px";return position;},scroll:function(deltaPixel){if(this.animating)
return this;var position=this.currentPosition()+deltaPixel;position=this.checkScroll(position,false);deltaPixel=position-this.currentPosition();if(deltaPixel!=0){this.animating=true;this.fire("scroll:started");var that=this;this.container.morph("opacity:0.5",{duration:0.2,afterFinish:function(){that.container.morph(that.posAttribute+": "+position+"px",{duration:0.4,delay:0.2,afterFinish:function(){that.container.morph("opacity:1",{duration:0.2,afterFinish:function(){that.animating=false;that.updateButtons().fire("scroll:ended",{shift:deltaPixel/that.currentSize()});}});}});}});}
return this;},scrollTo:function(index){if(this.animating||index<0||index>this.elements.length||index==this.currentIndex()||isNaN(parseInt(index)))
return this;return this.scroll((this.currentIndex()-index)*this.elementSize);},updateButtons:function(){this.updatePreviousButton();this.updateNextButton();return this;},updatePreviousButton:function(){var position=this.currentPosition();var previousClassName="previous_button"+this.options.disabledButtonSuffix;if(this.previousButton.hasClassName(previousClassName)&&position!=0){this.previousButton.removeClassName(previousClassName);this.fire('previousButton:enabled');}
if(!this.previousButton.hasClassName(previousClassName)&&position==0){this.previousButton.addClassName(previousClassName);this.fire('previousButton:disabled');}},updateNextButton:function(){var lastPosition=this.currentLastPosition();var size=this.currentSize();var nextClassName="next_button"+this.options.disabledButtonSuffix;if(this.nextButton.hasClassName(nextClassName)&&lastPosition!=size){this.nextButton.removeClassName(nextClassName);this.fire('nextButton:enabled');}
if(!this.nextButton.hasClassName(nextClassName)&&lastPosition==size){this.nextButton.addClassName(nextClassName);this.fire('nextButton:disabled');}},computeElementSize:function(){return this.elements.first().getDimensions()[this.dimAttribute];},currentIndex:function(){return-this.currentPosition()/this.elementSize;},currentLastPosition:function(){if(this.container.childElements().empty())
return 0;return this.currentPosition()+
this.elements.last().positionedOffset()[this.posAttribute]+
this.elementSize;},currentPosition:function(){return this.container.getNumStyle(this.posAttribute);},currentSize:function(){return this.container.parentNode.getDimensions()[this.dimAttribute];},updateSize:function(){this.nbVisible=this.currentSize()/this.elementSize;var scrollInc=this.options.scrollInc;if(scrollInc=="auto")
scrollInc=Math.floor(this.nbVisible);[this.previousButton,this.nextButton].each(function(button){if(!button)return;button.stopObserving("click",button.clickHandler);button.clickHandler=this.scroll.bind(this,(button==this.nextButton?-1:1)*scrollInc*this.elementSize);button.observe("click",button.clickHandler);},this);this.checkScroll(this.currentPosition(),true);this.updateButtons().fire('sizeUpdated');return this;}});UI.Ajax.Carousel=Class.create(UI.Carousel,{options:{elementSize:-1,url:null},initialize:function($super,element,options){if(!options.url)
throw("url option is required for UI.Ajax.Carousel");if(!options.elementSize)
throw("elementSize option is required for UI.Ajax.Carousel");$super(element,options);this.endIndex=0;this.hasMore=true;this.updateHandler=this.update.bind(this);this.updateAndScrollHandler=function(nbElements,transport,json){this.update(transport,json);this.scroll(nbElements);}.bind(this);this.runRequest.bind(this).defer({parameters:{from:0,to:Math.ceil(this.nbVisible)-1},onSuccess:this.updateHandler});},runRequest:function(options){this.requestRunning=true;new Ajax.Request(this.options.url,Object.extend({method:"GET"},options));this.fire("request:started");return this;},scroll:function($super,deltaPixel){if(this.animating||this.requestRunning)
return this;var nbElements=(-deltaPixel)/this.elementSize;if(this.hasMore&&nbElements>0&&this.currentIndex()+this.nbVisible+nbElements-1>this.endIndex){var from=this.endIndex+1;var to=Math.ceil(from+this.nbVisible-1);this.runRequest({parameters:{from:from,to:to},onSuccess:this.updateAndScrollHandler.curry(deltaPixel).bind(this)});return this;}
else
$super(deltaPixel);},update:function(transport,json){this.requestRunning=false;this.fire("request:ended");if(!json)
json=transport.responseJSON;this.hasMore=json.more;this.endIndex=Math.max(this.endIndex,json.to);this.elements=this.container.insert({bottom:json.html}).childElements();return this.updateButtons();},computeElementSize:function(){return this.options.elementSize;},updateSize:function($super){var nbVisible=this.nbVisible;$super();if(Math.floor(this.nbVisible)-Math.floor(nbVisible)>=1&&this.hasMore){if(this.currentIndex()+Math.floor(this.nbVisible)>=this.endIndex){var nbNew=Math.floor(this.currentIndex()+Math.floor(this.nbVisible)-this.endIndex);this.runRequest({parameters:{from:this.endIndex+1,to:this.endIndex+nbNew},onSuccess:this.updateHandler});}}
return this;},updateNextButton:function($super){var lastPosition=this.currentLastPosition();var size=this.currentSize();var nextClassName="next_button"+this.options.disabledButtonSuffix;if(this.nextButton.hasClassName(nextClassName)&&lastPosition>size){this.nextButton.removeClassName(nextClassName);this.fire('nextButton:enabled');}else if(this.nextButton.hasClassName(nextClassName)&&lastPosition!=size&&this.hasMore){this.nextButton.removeClassName(nextClassName);this.fire('nextButton:enabled');}else if(!this.nextButton.hasClassName(nextClassName)&&lastPosition==size&&!this.hasMore){this.nextButton.addClassName(nextClassName);this.fire('nextButton:disabled');}else if(!this.nextButton.hasClassName(nextClassName)&&typeof(this.hasMore)!='undefined'&&!this.hasMore){this.nextButton.addClassName(nextClassName);this.fire('nextButton:disabled');}}});
