var Prototype={ Version:'1.6.0.3', Browser:{ IE:!!(window.attachEvent&& navigator.userAgent.indexOf('Opera')===-1), Opera:navigator.userAgent.indexOf('Opera')>-1, WebKit:navigator.userAgent.indexOf('AppleWebKit/')>-1, Gecko:navigator.userAgent.indexOf('Gecko')>-1&& navigator.userAgent.indexOf('KHTML')===-1, MobileSafari:!!navigator.userAgent.match(/Apple.*Mobile.*Safari/) }, BrowserFeatures:{ XPath:!!document.evaluate, SelectorsAPI:!!document.querySelector, ElementExtensions:!!window.HTMLElement, SpecificElementExtensions: document.createElement('div')['__proto__']&& document.createElement('div')['__proto__']!== document.createElement('form')['__proto__'] }, ScriptFragment:']*>([\\S\\s]*?)<\/script>', JSONFilter:/^\/\*-secure-([\s\S]*)\*\/\s*$/, emptyFunction:function(){}, K:function(x){return x} }; if(Prototype.Browser.MobileSafari) Prototype.BrowserFeatures.SpecificElementExtensions=false; var Class={ create:function(){ var parent=null,properties=$A(arguments); if(Object.isFunction(properties[0])) parent=properties.shift(); function klass(){ this.initialize.apply(this,arguments); } Object.extend(klass,Class.Methods); klass.superclass=parent; klass.subclasses=[]; if(parent){ var subclass=function(){}; subclass.prototype=parent.prototype; klass.prototype=new subclass; parent.subclasses.push(klass); } for(var i=0;i0){ if(match=source.match(pattern)){ result+=source.slice(0,match.index); result+=String.interpret(replacement(match)); source=source.slice(match.index+match[0].length); }else{ result+=source,source=''; } } return result; }, sub:function(pattern,replacement,count){ replacement=this.gsub.prepareReplacement(replacement); count=Object.isUndefined(count)?1:count; return this.gsub(pattern,function(match){ if(--count<0)return match[0]; return replacement(match); }); }, scan:function(pattern,iterator){ this.gsub(pattern,iterator); return String(this); }, truncate:function(length,truncation){ length=length||30; truncation=Object.isUndefined(truncation)?'...':truncation; return this.length>length? this.slice(0,length-truncation.length)+truncation:String(this); }, strip:function(){ return this.replace(/^\s+/,'').replace(/\s+$/,''); }, stripTags:function(){ return this.replace(/<\/?[^>]+>/gi,''); }, stripScripts:function(){ return this.replace(new RegExp(Prototype.ScriptFragment,'img'),''); }, extractScripts:function(){ var matchAll=new RegExp(Prototype.ScriptFragment,'img'); var matchOne=new RegExp(Prototype.ScriptFragment,'im'); return(this.match(matchAll)||[]).map(function(scriptTag){ return(scriptTag.match(matchOne)||['',''])[1]; }); }, evalScripts:function(){ return this.extractScripts().map(function(script){return eval(script)}); }, escapeHTML:function(){ var self=arguments.callee; self.text.data=this; return self.div.innerHTML; }, unescapeHTML:function(){ var div=new Element('div'); div.innerHTML=this.stripTags(); return div.childNodes[0]?(div.childNodes.length>1? $A(div.childNodes).inject('',function(memo,node){return memo+node.nodeValue}): div.childNodes[0].nodeValue):''; }, toQueryParams:function(separator){ var match=this.strip().match(/([^?#]*)(#.*)?$/); if(!match)return{}; return match[1].split(separator||'&').inject({},function(hash,pair){ if((pair=pair.split('='))[0]){ var key=decodeURIComponent(pair.shift()); var value=pair.length>1?pair.join('='):pair[0]; if(value!=undefined)value=decodeURIComponent(value); if(key in hash){ if(!Object.isArray(hash[key]))hash[key]=[hash[key]]; hash[key].push(value); } else hash[key]=value; } return hash; }); }, toArray:function(){ return this.split(''); }, succ:function(){ return this.slice(0,this.length-1)+ String.fromCharCode(this.charCodeAt(this.length-1)+1); }, times:function(count){ return count<1?'':new Array(count+1).join(this); }, camelize:function(){ var parts=this.split('-'),len=parts.length; if(len==1)return parts[0]; var camelized=this.charAt(0)=='-' ?parts[0].charAt(0).toUpperCase()+parts[0].substring(1) :parts[0]; for(var i=1;i-1; }, startsWith:function(pattern){ return this.indexOf(pattern)===0; }, endsWith:function(pattern){ var d=this.length-pattern.length; return d>=0&&this.lastIndexOf(pattern)===d; }, empty:function(){ return this==''; }, blank:function(){ return/^\s*$/.test(this); }, interpolate:function(object,pattern){ return new Template(this,pattern).evaluate(object); } }); if(Prototype.Browser.WebKit||Prototype.Browser.IE)Object.extend(String.prototype,{ escapeHTML:function(){ return this.replace(/&/g,'&').replace(//g,'>'); }, unescapeHTML:function(){ return this.stripTags().replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); } }); String.prototype.gsub.prepareReplacement=function(replacement){ if(Object.isFunction(replacement))return replacement; var template=new Template(replacement); return function(match){return template.evaluate(match)}; }; String.prototype.parseQuery=String.prototype.toQueryParams; Object.extend(String.prototype.escapeHTML,{ div:document.createElement('div'), text:document.createTextNode('') }); String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text); var Template=Class.create({ initialize:function(template,pattern){ this.template=template.toString(); this.pattern=pattern||Template.Pattern; }, evaluate:function(object){ if(Object.isFunction(object.toTemplateReplacements)) object=object.toTemplateReplacements(); return this.template.gsub(this.pattern,function(match){ if(object==null)return''; var before=match[1]||''; if(before=='\\')return match[2]; var ctx=object,expr=match[3]; var pattern=/^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; match=pattern.exec(expr); if(match==null)return before; while(match!=null){ var comp=match[1].startsWith('[')?match[2].gsub('\\\\]',']'):match[1]; ctx=ctx[comp]; if(null==ctx||''==match[3])break; expr=expr.substring('['==match[3]?match[1].length:match[0].length); match=pattern.exec(expr); } return before+String.interpret(ctx); }); } }); Template.Pattern=/(^|.|\r|\n)(#\{(.*?)\})/; var $break={}; var Enumerable={ each:function(iterator,context){ var index=0; try{ this._each(function(value){ iterator.call(context,value,index++); }); }catch(e){ if(e!=$break)throw e; } return this; }, eachSlice:function(number,iterator,context){ var index=-number,slices=[],array=this.toArray(); if(number<1)return array; while((index+=number)=result) result=value; }); return result; }, min:function(iterator,context){ iterator=iterator||Prototype.K; var result; this.each(function(value,index){ value=iterator.call(context,value,index); if(result==null||valueb?1:0; }).pluck('value'); }, toArray:function(){ return this.map(); }, zip:function(){ var iterator=Prototype.K,args=$A(arguments); if(Object.isFunction(args.last())) iterator=args.pop(); var collections=[this].concat(args).map($A); return this.map(function(value,index){ return iterator(collections.pluck(index)); }); }, size:function(){ return this.toArray().length; }, inspect:function(){ return'#'; } }; Object.extend(Enumerable,{ map:Enumerable.collect, find:Enumerable.detect, select:Enumerable.findAll, filter:Enumerable.findAll, member:Enumerable.include, entries:Enumerable.toArray, every:Enumerable.all, some:Enumerable.any }); function $A(iterable){ if(!iterable)return[]; if(iterable.toArray)return iterable.toArray(); var length=iterable.length||0,results=new Array(length); while(length--)results[length]=iterable[length]; return results; } if(Prototype.Browser.WebKit){ $A=function(iterable){ if(!iterable)return[]; if(!(typeof iterable==='function'&&typeof iterable.length=== 'number'&&typeof iterable.item==='function')&&iterable.toArray) return iterable.toArray(); var length=iterable.length||0,results=new Array(length); while(length--)results[length]=iterable[length]; return results; }; } Array.from=$A; Object.extend(Array.prototype,Enumerable); if(!Array.prototype._reverse)Array.prototype._reverse=Array.prototype.reverse; Object.extend(Array.prototype,{ _each:function(iterator){ for(var i=0,length=this.length;i1?this:this[0]; }, uniq:function(sorted){ return this.inject([],function(array,value,index){ if(0==index||(sorted?array.last()!=value:!array.include(value))) array.push(value); return array; }); }, intersect:function(array){ return this.uniq().findAll(function(item){ return array.detect(function(value){return item===value}); }); }, clone:function(){ return[].concat(this); }, size:function(){ return this.length; }, inspect:function(){ return'['+this.map(Object.inspect).join(', ')+']'; }, toJSON:function(){ var results=[]; this.each(function(object){ var value=Object.toJSON(object); if(!Object.isUndefined(value))results.push(value); }); return'['+results.join(', ')+']'; } }); if(Object.isFunction(Array.prototype.forEach)) Array.prototype._each=Array.prototype.forEach; if(!Array.prototype.indexOf)Array.prototype.indexOf=function(item,i){ i||(i=0); var length=this.length; if(i<0)i=length+i; for(;i'; }, toJSON:function(){ return Object.toJSON(this.toObject()); }, clone:function(){ return new Hash(this); } } })()); Hash.prototype.toTemplateReplacements=Hash.prototype.toObject; Hash.from=$H; var ObjectRange=Class.create(Enumerable,{ initialize:function(start,end,exclusive){ this.start=start; this.end=end; this.exclusive=exclusive; }, _each:function(iterator){ var value=this.start; while(this.include(value)){ iterator(value); value=value.succ(); } }, include:function(value){ if(value1&&!((readyState==4)&&this._complete)) this.respondToReadyState(this.transport.readyState); }, setRequestHeaders:function(){ var headers={ 'X-Requested-With':'XMLHttpRequest', 'X-Prototype-Version':Prototype.Version, 'Accept':'text/javascript, text/html, application/xml, text/xml, */*' }; if(this.method=='post'){ headers['Content-type']=this.options.contentType+ (this.options.encoding?'; charset='+this.options.encoding:''); if(this.transport.overrideMimeType&& (navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005) headers['Connection']='close'; } if(typeof this.options.requestHeaders=='object'){ var extras=this.options.requestHeaders; if(Object.isFunction(extras.push)) for(var i=0,length=extras.length;i=200&&status<300); }, getStatus:function(){ try{ return this.transport.status||0; }catch(e){return 0} }, respondToReadyState:function(readyState){ var state=Ajax.Request.Events[readyState],response=new Ajax.Response(this); if(state=='Complete'){ try{ this._complete=true; (this.options['on'+response.status] ||this.options['on'+(this.success()?'Success':'Failure')] ||Prototype.emptyFunction)(response,response.headerJSON); }catch(e){ this.dispatchException(e); } var contentType=response.getHeader('Content-type'); if(this.options.evalJS=='force' ||(this.options.evalJS&&this.isSameOrigin()&&contentType &&contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) this.evalResponse(); } try{ (this.options['on'+state]||Prototype.emptyFunction)(response,response.headerJSON); Ajax.Responders.dispatch('on'+state,this,response,response.headerJSON); }catch(e){ this.dispatchException(e); } if(state=='Complete'){ this.transport.onreadystatechange=Prototype.emptyFunction; } }, isSameOrigin:function(){ var m=this.url.match(/^\s*https?:\/\/[^\/]*/); return!m||(m[0]=='#{protocol}//#{domain}#{port}'.interpolate({ protocol:location.protocol, domain:document.domain, port:location.port?':'+location.port:'' })); }, getHeader:function(name){ try{ return this.transport.getResponseHeader(name)||null; }catch(e){return null} }, evalResponse:function(){ try{ return eval((this.transport.responseText||'').unfilterJSON()); }catch(e){ this.dispatchException(e); } }, dispatchException:function(exception){ (this.options.onException||Prototype.emptyFunction)(this,exception); Ajax.Responders.dispatch('onException',this,exception); } }); Ajax.Request.Events= ['Uninitialized','Loading','Loaded','Interactive','Complete']; Ajax.Response=Class.create({ initialize:function(request){ this.request=request; var transport=this.transport=request.transport, readyState=this.readyState=transport.readyState; if((readyState>2&&!Prototype.Browser.IE)||readyState==4){ this.status=this.getStatus(); this.statusText=this.getStatusText(); this.responseText=String.interpret(transport.responseText); this.headerJSON=this._getHeaderJSON(); } if(readyState==4){ var xml=transport.responseXML; this.responseXML=Object.isUndefined(xml)?null:xml; this.responseJSON=this._getResponseJSON(); } }, status:0, statusText:'', getStatus:Ajax.Request.prototype.getStatus, getStatusText:function(){ try{ return this.transport.statusText||''; }catch(e){return''} }, getHeader:Ajax.Request.prototype.getHeader, getAllHeaders:function(){ try{ return this.getAllResponseHeaders(); }catch(e){return null} }, getResponseHeader:function(name){ return this.transport.getResponseHeader(name); }, getAllResponseHeaders:function(){ return this.transport.getAllResponseHeaders(); }, _getHeaderJSON:function(){ var json=this.getHeader('X-JSON'); if(!json)return null; json=decodeURIComponent(escape(json)); try{ return json.evalJSON(this.request.options.sanitizeJSON|| !this.request.isSameOrigin()); }catch(e){ this.request.dispatchException(e); } }, _getResponseJSON:function(){ var options=this.request.options; if(!options.evalJSON||(options.evalJSON!='force'&& !(this.getHeader('Content-type')||'').include('application/json'))|| this.responseText.blank()) return null; try{ return this.responseText.evalJSON(options.sanitizeJSON|| !this.request.isSameOrigin()); }catch(e){ this.request.dispatchException(e); } } }); Ajax.Updater=Class.create(Ajax.Request,{ initialize:function($super,container,url,options){ this.container={ success:(container.success||container), failure:(container.failure||(container.success?null:container)) }; options=Object.clone(options); var onComplete=options.onComplete; options.onComplete=(function(response,json){ this.updateContent(response.responseText); if(Object.isFunction(onComplete))onComplete(response,json); }).bind(this); $super(url,options); }, updateContent:function(responseText){ var receiver=this.container[this.success()?'success':'failure'], options=this.options; if(!options.evalScripts)responseText=responseText.stripScripts(); if(receiver=$(receiver)){ if(options.insertion){ if(Object.isString(options.insertion)){ var insertion={};insertion[options.insertion]=responseText; receiver.insert(insertion); } else options.insertion(receiver,responseText); } else receiver.update(responseText); } } }); Ajax.PeriodicalUpdater=Class.create(Ajax.Base,{ initialize:function($super,container,url,options){ $super(options); this.onComplete=this.options.onComplete; this.frequency=(this.options.frequency||2); this.decay=(this.options.decay||1); this.updater={}; this.container=container; this.url=url; this.start(); }, start:function(){ this.options.onComplete=this.updateComplete.bind(this); this.onTimerEvent(); }, stop:function(){ this.updater.options.onComplete=undefined; clearTimeout(this.timer); (this.onComplete||Prototype.emptyFunction).apply(this,arguments); }, updateComplete:function(response){ if(this.options.decay){ this.decay=(response.responseText==this.lastText? this.decay*this.options.decay:1); this.lastText=response.responseText; } this.timer=this.onTimerEvent.bind(this).delay(this.decay*this.frequency); }, onTimerEvent:function(){ this.updater=new Ajax.Updater(this.container,this.url,this.options); } }); function $(element){ if(arguments.length>1){ for(var i=0,elements=[],length=arguments.length;i'; delete attributes.name; return Element.writeAttribute(document.createElement(tagName),attributes); } if(!cache[tagName])cache[tagName]=Element.extend(document.createElement(tagName)); return Element.writeAttribute(cache[tagName].cloneNode(false),attributes); }; Object.extend(this.Element,element||{}); if(element)this.Element.prototype=element.prototype; }).call(window); Element.cache={}; Element.Methods={ visible:function(element){ return $(element).style.display!='none'; }, toggle:function(element){ element=$(element); Element[Element.visible(element)?'hide':'show'](element); return element; }, hide:function(element){ element=$(element); element.style.display='none'; return element; }, show:function(element){ element=$(element); element.style.display=''; return element; }, remove:function(element){ element=$(element); element.parentNode.removeChild(element); return element; }, update:function(element,content){ element=$(element); if(content&&content.toElement)content=content.toElement(); if(Object.isElement(content))return element.update().insert(content); content=Object.toHTML(content); element.innerHTML=content.stripScripts(); content.evalScripts.bind(content).defer(); return element; }, replace:function(element,content){ element=$(element); if(content&&content.toElement)content=content.toElement(); else if(!Object.isElement(content)){ content=Object.toHTML(content); var range=element.ownerDocument.createRange(); range.selectNode(element); content.evalScripts.bind(content).defer(); content=range.createContextualFragment(content.stripScripts()); } element.parentNode.replaceChild(content,element); return element; }, insert:function(element,insertions){ element=$(element); if(Object.isString(insertions)||Object.isNumber(insertions)|| Object.isElement(insertions)||(insertions&&(insertions.toElement||insertions.toHTML))) insertions={bottom:insertions}; var content,insert,tagName,childNodes; for(var position in insertions){ content=insertions[position]; position=position.toLowerCase(); insert=Element._insertionTranslations[position]; if(content&&content.toElement)content=content.toElement(); if(Object.isElement(content)){ insert(element,content); continue; } content=Object.toHTML(content); tagName=((position=='before'||position=='after') ?element.parentNode:element).tagName.toUpperCase(); childNodes=Element._getContentFromAnonymousElement(tagName,content.stripScripts()); if(position=='top'||position=='after')childNodes.reverse(); childNodes.each(insert.curry(element)); content.evalScripts.bind(content).defer(); } return element; }, wrap:function(element,wrapper,attributes){ element=$(element); if(Object.isElement(wrapper)) $(wrapper).writeAttribute(attributes||{}); else if(Object.isString(wrapper))wrapper=new Element(wrapper,attributes); else wrapper=new Element('div',wrapper); if(element.parentNode) element.parentNode.replaceChild(wrapper,element); wrapper.appendChild(element); return wrapper; }, inspect:function(element){ element=$(element); var result='<'+element.tagName.toLowerCase(); $H({'id':'id','className':'class'}).each(function(pair){ var property=pair.first(),attribute=pair.last(); var value=(element[property]||'').toString(); if(value)result+=' '+attribute+'='+value.inspect(true); }); return result+'>'; }, recursivelyCollect:function(element,property){ element=$(element); var elements=[]; while(element=element[property]) if(element.nodeType==1) elements.push(Element.extend(element)); return elements; }, ancestors:function(element){ return $(element).recursivelyCollect('parentNode'); }, descendants:function(element){ return $(element).select("*"); }, firstDescendant:function(element){ element=$(element).firstChild; while(element&&element.nodeType!=1)element=element.nextSibling; return $(element); }, immediateDescendants:function(element){ if(!(element=$(element).firstChild))return[]; while(element&&element.nodeType!=1)element=element.nextSibling; if(element)return[element].concat($(element).nextSiblings()); return[]; }, previousSiblings:function(element){ return $(element).recursivelyCollect('previousSibling'); }, nextSiblings:function(element){ return $(element).recursivelyCollect('nextSibling'); }, siblings:function(element){ element=$(element); return element.previousSiblings().reverse().concat(element.nextSiblings()); }, match:function(element,selector){ if(Object.isString(selector)) selector=new Selector(selector); return selector.match($(element)); }, up:function(element,expression,index){ element=$(element); if(arguments.length==1)return $(element.parentNode); var ancestors=element.ancestors(); return Object.isNumber(expression)?ancestors[expression]: Selector.findElement(ancestors,expression,index); }, down:function(element,expression,index){ element=$(element); if(arguments.length==1)return element.firstDescendant(); return Object.isNumber(expression)?element.descendants()[expression]: Element.select(element,expression)[index||0]; }, previous:function(element,expression,index){ element=$(element); if(arguments.length==1)return $(Selector.handlers.previousElementSibling(element)); var previousSiblings=element.previousSiblings(); return Object.isNumber(expression)?previousSiblings[expression]: Selector.findElement(previousSiblings,expression,index); }, next:function(element,expression,index){ element=$(element); if(arguments.length==1)return $(Selector.handlers.nextElementSibling(element)); var nextSiblings=element.nextSiblings(); return Object.isNumber(expression)?nextSiblings[expression]: Selector.findElement(nextSiblings,expression,index); }, select:function(){ var args=$A(arguments),element=$(args.shift()); return Selector.findChildElements(element,args); }, adjacent:function(){ var args=$A(arguments),element=$(args.shift()); return Selector.findChildElements(element.parentNode,args).without(element); }, identify:function(element){ element=$(element); var id=element.readAttribute('id'),self=arguments.callee; if(id)return id; do{id='anonymous_element_'+self.counter++}while($(id)); element.writeAttribute('id',id); return id; }, readAttribute:function(element,name){ element=$(element); if(Prototype.Browser.IE){ var t=Element._attributeTranslations.read; if(t.values[name])return t.values[name](element,name); if(t.names[name])name=t.names[name]; if(name.include(':')){ return(!element.attributes||!element.attributes[name])?null: element.attributes[name].value; } } return element.getAttribute(name); }, writeAttribute:function(element,name,value){ element=$(element); var attributes={},t=Element._attributeTranslations.write; if(typeof name=='object')attributes=name; else attributes[name]=Object.isUndefined(value)?true:value; for(var attr in attributes){ name=t.names[attr]||attr; value=attributes[attr]; if(t.values[attr])name=t.values[attr](element,value); if(value===false||value===null) element.removeAttribute(name); else if(value===true) element.setAttribute(name,name); else element.setAttribute(name,value); } return element; }, getHeight:function(element){ return $(element).getDimensions().height; }, getWidth:function(element){ return $(element).getDimensions().width; }, classNames:function(element){ return new Element.ClassNames(element); }, hasClassName:function(element,className){ if(!(element=$(element)))return; var elementClassName=element.className; return(elementClassName.length>0&&(elementClassName==className|| new RegExp("(^|\\s)"+className+"(\\s|$)").test(elementClassName))); }, addClassName:function(element,className){ if(!(element=$(element)))return; if(!element.hasClassName(className)) element.className+=(element.className?' ':'')+className; return element; }, removeClassName:function(element,className){ if(!(element=$(element)))return; element.className=element.className.replace( new RegExp("(^|\\s+)"+className+"(\\s+|$)"),' ').strip(); return element; }, toggleClassName:function(element,className){ if(!(element=$(element)))return; return element[element.hasClassName(className)? 'removeClassName':'addClassName'](className); }, cleanWhitespace:function(element){ element=$(element); var node=element.firstChild; while(node){ var nextNode=node.nextSibling; if(node.nodeType==3&&!/\S/.test(node.nodeValue)) element.removeChild(node); node=nextNode; } return element; }, empty:function(element){ return $(element).innerHTML.blank(); }, descendantOf:function(element,ancestor){ element=$(element),ancestor=$(ancestor); if(element.compareDocumentPosition) return(element.compareDocumentPosition(ancestor)&8)===8; if(ancestor.contains) return ancestor.contains(element)&&ancestor!==element; while(element=element.parentNode) if(element==ancestor)return true; return false; }, scrollTo:function(element){ element=$(element); var pos=element.cumulativeOffset(); window.scrollTo(pos[0],pos[1]); return element; }, getStyle:function(element,style){ element=$(element); style=style=='float'?'cssFloat':style.camelize(); var value=element.style[style]; if(!value||value=='auto'){ var css=document.defaultView.getComputedStyle(element,null); value=css?css[style]:null; } if(style=='opacity')return value?parseFloat(value):1.0; return value=='auto'?null:value; }, getOpacity:function(element){ return $(element).getStyle('opacity'); }, setStyle:function(element,styles){ element=$(element); var elementStyle=element.style,match; if(Object.isString(styles)){ element.style.cssText+=';'+styles; return styles.include('opacity')? element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]):element; } for(var property in styles) if(property=='opacity')element.setOpacity(styles[property]); else elementStyle[(property=='float'||property=='cssFloat')? (Object.isUndefined(elementStyle.styleFloat)?'cssFloat':'styleFloat'): property]=styles[property]; return element; }, setOpacity:function(element,value){ element=$(element); element.style.opacity=(value==1||value==='')?'': (value<0.00001)?0:value; return element; }, getDimensions:function(element){ element=$(element); var display=element.getStyle('display'); if(display!='none'&&display!=null) return{width:element.offsetWidth,height:element.offsetHeight}; var els=element.style; var originalVisibility=els.visibility; var originalPosition=els.position; var originalDisplay=els.display; els.visibility='hidden'; els.position='absolute'; els.display='block'; var originalWidth=element.clientWidth; var originalHeight=element.clientHeight; els.display=originalDisplay; els.position=originalPosition; els.visibility=originalVisibility; return{width:originalWidth,height:originalHeight}; }, makePositioned:function(element){ element=$(element); var pos=Element.getStyle(element,'position'); if(pos=='static'||!pos){ element._madePositioned=true; element.style.position='relative'; if(Prototype.Browser.Opera){ element.style.top=0; element.style.left=0; } } return element; }, undoPositioned:function(element){ element=$(element); if(element._madePositioned){ element._madePositioned=undefined; element.style.position= element.style.top= element.style.left= element.style.bottom= element.style.right=''; } return element; }, makeClipping:function(element){ element=$(element); if(element._overflow)return element; element._overflow=Element.getStyle(element,'overflow')||'auto'; if(element._overflow!=='hidden') element.style.overflow='hidden'; return element; }, undoClipping:function(element){ element=$(element); if(!element._overflow)return element; element.style.overflow=element._overflow=='auto'?'':element._overflow; element._overflow=null; return element; }, cumulativeOffset:function(element){ var valueT=0,valueL=0; do{ valueT+=element.offsetTop||0; valueL+=element.offsetLeft||0; element=element.offsetParent; }while(element); return Element._returnOffset(valueL,valueT); }, positionedOffset:function(element){ var valueT=0,valueL=0; do{ valueT+=element.offsetTop||0; valueL+=element.offsetLeft||0; element=element.offsetParent; if(element){ if(element.tagName.toUpperCase()=='BODY')break; var p=Element.getStyle(element,'position'); if(p!=='static')break; } }while(element); return Element._returnOffset(valueL,valueT); }, absolutize:function(element){ element=$(element); if(element.getStyle('position')=='absolute')return element; var offsets=element.positionedOffset(); var top=offsets[1]; var left=offsets[0]; var width=element.clientWidth; var height=element.clientHeight; element._originalLeft=left-parseFloat(element.style.left||0); element._originalTop=top-parseFloat(element.style.top||0); element._originalWidth=element.style.width; element._originalHeight=element.style.height; element.style.position='absolute'; element.style.top=top+'px'; element.style.left=left+'px'; element.style.width=width+'px'; element.style.height=height+'px'; return element; }, relativize:function(element){ element=$(element); if(element.getStyle('position')=='relative')return element; element.style.position='relative'; var top=parseFloat(element.style.top||0)-(element._originalTop||0); var left=parseFloat(element.style.left||0)-(element._originalLeft||0); element.style.top=top+'px'; element.style.left=left+'px'; element.style.height=element._originalHeight; element.style.width=element._originalWidth; return element; }, cumulativeScrollOffset:function(element){ var valueT=0,valueL=0; do{ valueT+=element.scrollTop||0; valueL+=element.scrollLeft||0; element=element.parentNode; }while(element); return Element._returnOffset(valueL,valueT); }, getOffsetParent:function(element){ if(element.offsetParent)return $(element.offsetParent); if(element==document.body)return $(element); while((element=element.parentNode)&&element!=document.body) if(Element.getStyle(element,'position')!='static') return $(element); return $(document.body); }, viewportOffset:function(forElement){ var valueT=0,valueL=0; var element=forElement; do{ valueT+=element.offsetTop||0; valueL+=element.offsetLeft||0; if(element.offsetParent==document.body&& Element.getStyle(element,'position')=='absolute')break; }while(element=element.offsetParent); element=forElement; do{ if(!Prototype.Browser.Opera||(element.tagName&&(element.tagName.toUpperCase()=='BODY'))){ valueT-=element.scrollTop||0; valueL-=element.scrollLeft||0; } }while(element=element.parentNode); return Element._returnOffset(valueL,valueT); }, clonePosition:function(element,source){ var options=Object.extend({ setLeft:true, setTop:true, setWidth:true, setHeight:true, offsetTop:0, offsetLeft:0 },arguments[2]||{}); source=$(source); var p=source.viewportOffset(); element=$(element); var delta=[0,0]; var parent=null; if(Element.getStyle(element,'position')=='absolute'){ parent=element.getOffsetParent(); delta=parent.viewportOffset(); } if(parent==document.body){ delta[0]-=document.body.offsetLeft; delta[1]-=document.body.offsetTop; } if(options.setLeft)element.style.left=(p[0]-delta[0]+options.offsetLeft)+'px'; if(options.setTop)element.style.top=(p[1]-delta[1]+options.offsetTop)+'px'; if(options.setWidth)element.style.width=source.offsetWidth+'px'; if(options.setHeight)element.style.height=source.offsetHeight+'px'; return element; } }; Element.Methods.identify.counter=1; Object.extend(Element.Methods,{ getElementsBySelector:Element.Methods.select, childElements:Element.Methods.immediateDescendants }); Element._attributeTranslations={ write:{ names:{ className:'class', htmlFor:'for' }, values:{} } }; if(Prototype.Browser.Opera){ Element.Methods.getStyle=Element.Methods.getStyle.wrap( function(proceed,element,style){ switch(style){ case'left':case'top':case'right':case'bottom': if(proceed(element,'position')==='static')return null; case'height':case'width': if(!Element.visible(element))return null; var dim=parseInt(proceed(element,style),10); if(dim!==element['offset'+style.capitalize()]) return dim+'px'; var properties; if(style==='height'){ properties=['border-top-width','padding-top', 'padding-bottom','border-bottom-width']; } else{ properties=['border-left-width','padding-left', 'padding-right','border-right-width']; } return properties.inject(dim,function(memo,property){ var val=proceed(element,property); return val===null?memo:memo-parseInt(val,10); })+'px'; default:return proceed(element,style); } } ); Element.Methods.readAttribute=Element.Methods.readAttribute.wrap( function(proceed,element,attribute){ if(attribute==='title')return element.title; return proceed(element,attribute); } ); } else if(Prototype.Browser.IE){ Element.Methods.getOffsetParent=Element.Methods.getOffsetParent.wrap( function(proceed,element){ element=$(element); try{element.offsetParent} catch(e){return $(document.body)} var position=element.getStyle('position'); if(position!=='static')return proceed(element); element.setStyle({position:'relative'}); var value=proceed(element); element.setStyle({position:position}); return value; } ); $w('positionedOffset viewportOffset').each(function(method){ Element.Methods[method]=Element.Methods[method].wrap( function(proceed,element){ element=$(element); try{element.offsetParent} catch(e){return Element._returnOffset(0,0)} var position=element.getStyle('position'); if(position!=='static')return proceed(element); var offsetParent=element.getOffsetParent(); if(offsetParent&&offsetParent.getStyle('position')==='fixed') offsetParent.setStyle({zoom:1}); element.setStyle({position:'relative'}); var value=proceed(element); element.setStyle({position:position}); return value; } ); }); Element.Methods.cumulativeOffset=Element.Methods.cumulativeOffset.wrap( function(proceed,element){ try{element.offsetParent} catch(e){return Element._returnOffset(0,0)} return proceed(element); } ); Element.Methods.getStyle=function(element,style){ element=$(element); style=(style=='float'||style=='cssFloat')?'styleFloat':style.camelize(); var value=element.style[style]; if(!value&&element.currentStyle)value=element.currentStyle[style]; if(style=='opacity'){ if(value=(element.getStyle('filter')||'').match(/alpha\(opacity=(.*)\)/)) if(value[1])return parseFloat(value[1])/100; return 1.0; } if(value=='auto'){ if((style=='width'||style=='height')&&(element.getStyle('display')!='none')) return element['offset'+style.capitalize()]+'px'; return null; } return value; }; Element.Methods.setOpacity=function(element,value){ function stripAlpha(filter){ return filter.replace(/alpha\([^\)]*\)/gi,''); } element=$(element); var currentStyle=element.currentStyle; if((currentStyle&&!currentStyle.hasLayout)|| (!currentStyle&&element.style.zoom=='normal')) element.style.zoom=1; var filter=element.getStyle('filter'),style=element.style; if(value==1||value===''){ (filter=stripAlpha(filter))? style.filter=filter:style.removeAttribute('filter'); return element; }else if(value<0.00001)value=0; style.filter=stripAlpha(filter)+ 'alpha(opacity='+(value*100)+')'; return element; }; Element._attributeTranslations={ read:{ names:{ 'class':'className', 'for':'htmlFor' }, values:{ _getAttr:function(element,attribute){ return element.getAttribute(attribute,2); }, _getAttrNode:function(element,attribute){ var node=element.getAttributeNode(attribute); return node?node.value:""; }, _getEv:function(element,attribute){ attribute=element.getAttribute(attribute); return attribute?attribute.toString().slice(23,-2):null; }, _flag:function(element,attribute){ return $(element).hasAttribute(attribute)?attribute:null; }, style:function(element){ return element.style.cssText.toLowerCase(); }, title:function(element){ return element.title; } } } }; Element._attributeTranslations.write={ names:Object.extend({ cellpadding:'cellPadding', cellspacing:'cellSpacing' },Element._attributeTranslations.read.names), values:{ checked:function(element,value){ element.checked=!!value; }, style:function(element,value){ element.style.cssText=value?value:''; } } }; Element._attributeTranslations.has={}; $w('colSpan rowSpan vAlign dateTime accessKey tabIndex '+ 'encType maxLength readOnly longDesc frameBorder').each(function(attr){ Element._attributeTranslations.write.names[attr.toLowerCase()]=attr; Element._attributeTranslations.has[attr.toLowerCase()]=attr; }); (function(v){ Object.extend(v,{ href:v._getAttr, src:v._getAttr, type:v._getAttr, action:v._getAttrNode, disabled:v._flag, checked:v._flag, readonly:v._flag, multiple:v._flag, onload:v._getEv, onunload:v._getEv, onclick:v._getEv, ondblclick:v._getEv, onmousedown:v._getEv, onmouseup:v._getEv, onmouseover:v._getEv, onmousemove:v._getEv, onmouseout:v._getEv, onfocus:v._getEv, onblur:v._getEv, onkeypress:v._getEv, onkeydown:v._getEv, onkeyup:v._getEv, onsubmit:v._getEv, onreset:v._getEv, onselect:v._getEv, onchange:v._getEv }); })(Element._attributeTranslations.read.values); } else if(Prototype.Browser.Gecko&&/rv:1\.8\.0/.test(navigator.userAgent)){ Element.Methods.setOpacity=function(element,value){ element=$(element); element.style.opacity=(value==1)?0.999999: (value==='')?'':(value<0.00001)?0:value; return element; }; } else if(Prototype.Browser.WebKit){ Element.Methods.setOpacity=function(element,value){ element=$(element); element.style.opacity=(value==1||value==='')?'': (value<0.00001)?0:value; if(value==1) if(element.tagName.toUpperCase()=='IMG'&&element.width){ element.width++;element.width--; }else try{ var n=document.createTextNode(' '); element.appendChild(n); element.removeChild(n); }catch(e){} return element; }; Element.Methods.cumulativeOffset=function(element){ var valueT=0,valueL=0; do{ valueT+=element.offsetTop||0; valueL+=element.offsetLeft||0; if(element.offsetParent==document.body) if(Element.getStyle(element,'position')=='absolute')break; element=element.offsetParent; }while(element); return Element._returnOffset(valueL,valueT); }; } if(Prototype.Browser.IE||Prototype.Browser.Opera){ Element.Methods.update=function(element,content){ element=$(element); if(content&&content.toElement)content=content.toElement(); if(Object.isElement(content))return element.update().insert(content); content=Object.toHTML(content); var tagName=element.tagName.toUpperCase(); if(tagName in Element._insertionTranslations.tags){ $A(element.childNodes).each(function(node){element.removeChild(node)}); Element._getContentFromAnonymousElement(tagName,content.stripScripts()) .each(function(node){element.appendChild(node)}); } else element.innerHTML=content.stripScripts(); content.evalScripts.bind(content).defer(); return element; }; } if('outerHTML'in document.createElement('div')){ Element.Methods.replace=function(element,content){ element=$(element); if(content&&content.toElement)content=content.toElement(); if(Object.isElement(content)){ element.parentNode.replaceChild(content,element); return element; } content=Object.toHTML(content); var parent=element.parentNode,tagName=parent.tagName.toUpperCase(); if(Element._insertionTranslations.tags[tagName]){ var nextSibling=element.next(); var fragments=Element._getContentFromAnonymousElement(tagName,content.stripScripts()); parent.removeChild(element); if(nextSibling) fragments.each(function(node){parent.insertBefore(node,nextSibling)}); else fragments.each(function(node){parent.appendChild(node)}); } else element.outerHTML=content.stripScripts(); content.evalScripts.bind(content).defer(); return element; }; } Element._returnOffset=function(l,t){ var result=[l,t]; result.left=l; result.top=t; return result; }; Element._getContentFromAnonymousElement=function(tagName,html){ var div=new Element('div'),t=Element._insertionTranslations.tags[tagName]; if(t){ div.innerHTML=t[0]+html+t[1]; t[2].times(function(){div=div.firstChild}); }else div.innerHTML=html; return $A(div.childNodes); }; Element._insertionTranslations={ before:function(element,node){ element.parentNode.insertBefore(node,element); }, top:function(element,node){ element.insertBefore(node,element.firstChild); }, bottom:function(element,node){ element.appendChild(node); }, after:function(element,node){ element.parentNode.insertBefore(node,element.nextSibling); }, tags:{ TABLE:['','
',1], TBODY:['','
',2], TR:['','
',3], TD:['
','
',4], SELECT:['',1] } }; (function(){ Object.extend(this.tags,{ THEAD:this.tags.TBODY, TFOOT:this.tags.TBODY, TH:this.tags.TD }); }).call(Element._insertionTranslations); Element.Methods.Simulated={ hasAttribute:function(element,attribute){ attribute=Element._attributeTranslations.has[attribute]||attribute; var node=$(element).getAttributeNode(attribute); return!!(node&&node.specified); } }; Element.Methods.ByTag={}; Object.extend(Element,Element.Methods); if(!Prototype.BrowserFeatures.ElementExtensions&& document.createElement('div')['__proto__']){ window.HTMLElement={}; window.HTMLElement.prototype=document.createElement('div')['__proto__']; Prototype.BrowserFeatures.ElementExtensions=true; } Element.extend=(function(){ if(Prototype.BrowserFeatures.SpecificElementExtensions) return Prototype.K; var Methods={},ByTag=Element.Methods.ByTag; var extend=Object.extend(function(element){ if(!element||element._extendedByPrototype|| element.nodeType!=1||element==window)return element; var methods=Object.clone(Methods), tagName=element.tagName.toUpperCase(),property,value; if(ByTag[tagName])Object.extend(methods,ByTag[tagName]); for(property in methods){ value=methods[property]; if(Object.isFunction(value)&&!(property in element)) element[property]=value.methodize(); } element._extendedByPrototype=Prototype.emptyFunction; return element; },{ refresh:function(){ if(!Prototype.BrowserFeatures.ElementExtensions){ Object.extend(Methods,Element.Methods); Object.extend(Methods,Element.Methods.Simulated); } } }); extend.refresh(); return extend; })(); Element.hasAttribute=function(element,attribute){ if(element.hasAttribute)return element.hasAttribute(attribute); return Element.Methods.Simulated.hasAttribute(element,attribute); }; Element.addMethods=function(methods){ var F=Prototype.BrowserFeatures,T=Element.Methods.ByTag; if(!methods){ Object.extend(Form,Form.Methods); Object.extend(Form.Element,Form.Element.Methods); Object.extend(Element.Methods.ByTag,{ "FORM":Object.clone(Form.Methods), "INPUT":Object.clone(Form.Element.Methods), "SELECT":Object.clone(Form.Element.Methods), "TEXTAREA":Object.clone(Form.Element.Methods) }); } if(arguments.length==2){ var tagName=methods; methods=arguments[1]; } if(!tagName)Object.extend(Element.Methods,methods||{}); else{ if(Object.isArray(tagName))tagName.each(extend); else extend(tagName); } function extend(tagName){ tagName=tagName.toUpperCase(); if(!Element.Methods.ByTag[tagName]) Element.Methods.ByTag[tagName]={}; Object.extend(Element.Methods.ByTag[tagName],methods); } function copy(methods,destination,onlyIfAbsent){ onlyIfAbsent=onlyIfAbsent||false; for(var property in methods){ var value=methods[property]; if(!Object.isFunction(value))continue; if(!onlyIfAbsent||!(property in destination)) destination[property]=value.methodize(); } } function findDOMClass(tagName){ var klass; var trans={ "OPTGROUP":"OptGroup","TEXTAREA":"TextArea","P":"Paragraph", "FIELDSET":"FieldSet","UL":"UList","OL":"OList","DL":"DList", "DIR":"Directory","H1":"Heading","H2":"Heading","H3":"Heading", "H4":"Heading","H5":"Heading","H6":"Heading","Q":"Quote", "INS":"Mod","DEL":"Mod","A":"Anchor","IMG":"Image","CAPTION": "TableCaption","COL":"TableCol","COLGROUP":"TableCol","THEAD": "TableSection","TFOOT":"TableSection","TBODY":"TableSection","TR": "TableRow","TH":"TableCell","TD":"TableCell","FRAMESET": "FrameSet","IFRAME":"IFrame" }; if(trans[tagName])klass='HTML'+trans[tagName]+'Element'; if(window[klass])return window[klass]; klass='HTML'+tagName+'Element'; if(window[klass])return window[klass]; klass='HTML'+tagName.capitalize()+'Element'; if(window[klass])return window[klass]; window[klass]={}; window[klass].prototype=document.createElement(tagName)['__proto__']; return window[klass]; } if(F.ElementExtensions){ copy(Element.Methods,HTMLElement.prototype); copy(Element.Methods.Simulated,HTMLElement.prototype,true); } if(F.SpecificElementExtensions){ for(var tag in Element.Methods.ByTag){ var klass=findDOMClass(tag); if(Object.isUndefined(klass))continue; copy(T[tag],klass.prototype); } } Object.extend(Element,Element.Methods); delete Element.ByTag; if(Element.extend.refresh)Element.extend.refresh(); Element.cache={}; }; document.viewport={ getDimensions:function(){ var dimensions={},B=Prototype.Browser; $w('width height').each(function(d){ var D=d.capitalize(); if(B.WebKit&&!document.evaluate){ dimensions[d]=self['inner'+D]; }else if(B.Opera&&parseFloat(window.opera.version())<9.5){ dimensions[d]=document.body['client'+D] }else{ dimensions[d]=document.documentElement['client'+D]; } }); return dimensions; }, getWidth:function(){ return this.getDimensions().width; }, getHeight:function(){ return this.getDimensions().height; }, getScrollOffsets:function(){ return Element._returnOffset( window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft, window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop); } }; var Selector=Class.create({ initialize:function(expression){ this.expression=expression.strip(); if(this.shouldUseSelectorsAPI()){ this.mode='selectorsAPI'; }else if(this.shouldUseXPath()){ this.mode='xpath'; this.compileXPathMatcher(); }else{ this.mode="normal"; this.compileMatcher(); } }, shouldUseXPath:function(){ if(!Prototype.BrowserFeatures.XPath)return false; var e=this.expression; if(Prototype.Browser.WebKit&& (e.include("-of-type")||e.include(":empty"))) return false; if((/(\[[\w-]*?:|:checked)/).test(e)) return false; return true; }, shouldUseSelectorsAPI:function(){ if(!Prototype.BrowserFeatures.SelectorsAPI)return false; if(!Selector._div)Selector._div=new Element('div'); try{ Selector._div.querySelector(this.expression); }catch(e){ return false; } return true; }, compileMatcher:function(){ var e=this.expression,ps=Selector.patterns,h=Selector.handlers, c=Selector.criteria,le,p,m; if(Selector._cache[e]){ this.matcher=Selector._cache[e]; return; } this.matcher=["this.matcher = function(root) {", "var r = root, h = Selector.handlers, c = false, n;"]; while(e&&le!=e&&(/\S/).test(e)){ le=e; for(var i in ps){ p=ps[i]; if(m=e.match(p)){ this.matcher.push(Object.isFunction(c[i])?c[i](m): new Template(c[i]).evaluate(m)); e=e.replace(m[0],''); break; } } } this.matcher.push("return h.unique(n);\n}"); eval(this.matcher.join('\n')); Selector._cache[this.expression]=this.matcher; }, compileXPathMatcher:function(){ var e=this.expression,ps=Selector.patterns, x=Selector.xpath,le,m; if(Selector._cache[e]){ this.xpath=Selector._cache[e];return; } this.matcher=['.//*']; while(e&&le!=e&&(/\S/).test(e)){ le=e; for(var i in ps){ if(m=e.match(ps[i])){ this.matcher.push(Object.isFunction(x[i])?x[i](m): new Template(x[i]).evaluate(m)); e=e.replace(m[0],''); break; } } } this.xpath=this.matcher.join(''); Selector._cache[this.expression]=this.xpath; }, findElements:function(root){ root=root||document; var e=this.expression,results; switch(this.mode){ case'selectorsAPI': if(root!==document){ var oldId=root.id,id=$(root).identify(); e="#"+id+" "+e; } results=$A(root.querySelectorAll(e)).map(Element.extend); root.id=oldId; return results; case'xpath': return document._getElementsByXPath(this.xpath,root); default: return this.matcher(root); } }, match:function(element){ this.tokens=[]; var e=this.expression,ps=Selector.patterns,as=Selector.assertions; var le,p,m; while(e&&le!==e&&(/\S/).test(e)){ le=e; for(var i in ps){ p=ps[i]; if(m=e.match(p)){ if(as[i]){ this.tokens.push([i,Object.clone(m)]); e=e.replace(m[0],''); }else{ return this.findElements(document).include(element); } } } } var match=true,name,matches; for(var i=0,token;token=this.tokens[i];i++){ name=token[0],matches=token[1]; if(!Selector.assertions[name](element,matches)){ match=false;break; } } return match; }, toString:function(){ return this.expression; }, inspect:function(){ return"#"; } }); Object.extend(Selector,{ _cache:{}, xpath:{ descendant:"//*", child:"/*", adjacent:"/following-sibling::*[1]", laterSibling:'/following-sibling::*', tagName:function(m){ if(m[1]=='*')return''; return"[local-name()='"+m[1].toLowerCase()+ "' or local-name()='"+m[1].toUpperCase()+"']"; }, className:"[contains(concat(' ', @class, ' '), ' #{1} ')]", id:"[@id='#{1}']", attrPresence:function(m){ m[1]=m[1].toLowerCase(); return new Template("[@#{1}]").evaluate(m); }, attr:function(m){ m[1]=m[1].toLowerCase(); m[3]=m[5]||m[6]; return new Template(Selector.xpath.operators[m[2]]).evaluate(m); }, pseudo:function(m){ var h=Selector.xpath.pseudos[m[1]]; if(!h)return''; if(Object.isFunction(h))return h(m); return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); }, operators:{ '=':"[@#{1}='#{3}']", '!=':"[@#{1}!='#{3}']", '^=':"[starts-with(@#{1}, '#{3}')]", '$=':"[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", '*=':"[contains(@#{1}, '#{3}')]", '~=':"[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", '|=':"[contains(concat('-', @#{1}, '-'), '-#{3}-')]" }, pseudos:{ 'first-child':'[not(preceding-sibling::*)]', 'last-child':'[not(following-sibling::*)]', 'only-child':'[not(preceding-sibling::* or following-sibling::*)]', 'empty':"[count(*) = 0 and (count(text()) = 0)]", 'checked':"[@checked]", 'disabled':"[(@disabled) and (@type!='hidden')]", 'enabled':"[not(@disabled) and (@type!='hidden')]", 'not':function(m){ var e=m[6],p=Selector.patterns, x=Selector.xpath,le,v; var exclusion=[]; while(e&&le!=e&&(/\S/).test(e)){ le=e; for(var i in p){ if(m=e.match(p[i])){ v=Object.isFunction(x[i])?x[i](m):new Template(x[i]).evaluate(m); exclusion.push("("+v.substring(1,v.length-1)+")"); e=e.replace(m[0],''); break; } } } return"[not("+exclusion.join(" and ")+")]"; }, 'nth-child':function(m){ return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ",m); }, 'nth-last-child':function(m){ return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ",m); }, 'nth-of-type':function(m){ return Selector.xpath.pseudos.nth("position() ",m); }, 'nth-last-of-type':function(m){ return Selector.xpath.pseudos.nth("(last() + 1 - position()) ",m); }, 'first-of-type':function(m){ m[6]="1";return Selector.xpath.pseudos['nth-of-type'](m); }, 'last-of-type':function(m){ m[6]="1";return Selector.xpath.pseudos['nth-last-of-type'](m); }, 'only-of-type':function(m){ var p=Selector.xpath.pseudos;return p['first-of-type'](m)+p['last-of-type'](m); }, nth:function(fragment,m){ var mm,formula=m[6],predicate; if(formula=='even')formula='2n+0'; if(formula=='odd')formula='2n+1'; if(mm=formula.match(/^(\d+)$/)) return'['+fragment+"= "+mm[1]+']'; if(mm=formula.match(/^(-?\d*)?n(([+-])(\d+))?/)){ if(mm[1]=="-")mm[1]=-1; var a=mm[1]?Number(mm[1]):1; var b=mm[2]?Number(mm[2]):0; predicate="[((#{fragment} - #{b}) mod #{a} = 0) and "+ "((#{fragment} - #{b}) div #{a} >= 0)]"; return new Template(predicate).evaluate({ fragment:fragment,a:a,b:b}); } } } }, criteria:{ tagName:'n = h.tagName(n, r, "#{1}", c); c = false;', className:'n = h.className(n, r, "#{1}", c); c = false;', id:'n = h.id(n, r, "#{1}", c); c = false;', attrPresence:'n = h.attrPresence(n, r, "#{1}", c); c = false;', attr:function(m){ m[3]=(m[5]||m[6]); return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m); }, pseudo:function(m){ if(m[6])m[6]=m[6].replace(/"/g,'\\"'); return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); }, descendant:'c = "descendant";', child:'c = "child";', adjacent:'c = "adjacent";', laterSibling:'c = "laterSibling";' }, patterns:{ laterSibling:/^\s*~\s*/, child:/^\s*>\s*/, adjacent:/^\s*\+\s*/, descendant:/^\s/, tagName:/^\s*(\*|[\w\-]+)(\b|$)?/, id:/^#([\w\-\*]+)(\b|$)/, className:/^\.([\w\-\*]+)(\b|$)/, pseudo: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/, attrPresence:/^\[((?:[\w]+:)?[\w]+)\]/, attr:/\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ }, assertions:{ tagName:function(element,matches){ return matches[1].toUpperCase()==element.tagName.toUpperCase(); }, className:function(element,matches){ return Element.hasClassName(element,matches[1]); }, id:function(element,matches){ return element.id===matches[1]; }, attrPresence:function(element,matches){ return Element.hasAttribute(element,matches[1]); }, attr:function(element,matches){ var nodeValue=Element.readAttribute(element,matches[1]); return nodeValue&&Selector.operators[matches[2]](nodeValue,matches[5]||matches[6]); } }, handlers:{ concat:function(a,b){ for(var i=0,node;node=b[i];i++) a.push(node); return a; }, mark:function(nodes){ var _true=Prototype.emptyFunction; for(var i=0,node;node=nodes[i];i++) node._countedByPrototype=_true; return nodes; }, unmark:function(nodes){ for(var i=0,node;node=nodes[i];i++) node._countedByPrototype=undefined; return nodes; }, index:function(parentNode,reverse,ofType){ parentNode._countedByPrototype=Prototype.emptyFunction; if(reverse){ for(var nodes=parentNode.childNodes,i=nodes.length-1,j=1;i>=0;i--){ var node=nodes[i]; if(node.nodeType==1&&(!ofType||node._countedByPrototype))node.nodeIndex=j++; } }else{ for(var i=0,j=1,nodes=parentNode.childNodes;node=nodes[i];i++) if(node.nodeType==1&&(!ofType||node._countedByPrototype))node.nodeIndex=j++; } }, unique:function(nodes){ if(nodes.length==0)return nodes; var results=[],n; for(var i=0,l=nodes.length;i0?[b]:[]; return $R(1,total).inject([],function(memo,i){ if(0==(i-b)%a&&(i-b)/a>=0)memo.push(i); return memo; }); }, nth:function(nodes,formula,root,reverse,ofType){ if(nodes.length==0)return[]; if(formula=='even')formula='2n+0'; if(formula=='odd')formula='2n+1'; var h=Selector.handlers,results=[],indexed=[],m; h.mark(nodes); for(var i=0,node;node=nodes[i];i++){ if(!node.parentNode._countedByPrototype){ h.index(node.parentNode,reverse,ofType); indexed.push(node.parentNode); } } if(formula.match(/^\d+$/)){ formula=Number(formula); for(var i=0,node;node=nodes[i];i++) if(node.nodeIndex==formula)results.push(node); }else if(m=formula.match(/^(-?\d*)?n(([+-])(\d+))?/)){ if(m[1]=="-")m[1]=-1; var a=m[1]?Number(m[1]):1; var b=m[2]?Number(m[2]):0; var indices=Selector.pseudos.getIndices(a,b,nodes.length); for(var i=0,node,l=indices.length;node=nodes[i];i++){ for(var j=0;j+()\s-]+|\*|\[.*?\])+)\s*(,|$)/,function(m){ expressions.push(m[1].strip()); }); return expressions; }, matchElements:function(elements,expression){ var matches=$$(expression),h=Selector.handlers; h.mark(matches); for(var i=0,results=[],element;element=elements[i];i++) if(element._countedByPrototype)results.push(element); h.unmark(matches); return results; }, findElement:function(elements,expression,index){ if(Object.isNumber(expression)){ index=expression;expression=false; } return Selector.matchElements(elements,expression||'*')[index||0]; }, findChildElements:function(element,expressions){ expressions=Selector.split(expressions.join(',')); var results=[],h=Selector.handlers; for(var i=0,l=expressions.length,selector;i1)?h.unique(results):results; } }); if(Prototype.Browser.IE){ Object.extend(Selector.handlers,{ concat:function(a,b){ for(var i=0,node;node=b[i];i++) if(node.tagName!=="!")a.push(node); return a; }, unmark:function(nodes){ for(var i=0,node;node=nodes[i];i++) node.removeAttribute('_countedByPrototype'); return nodes; } }); } function $$(){ return Selector.findChildElements(document,$A(arguments)); } var Form={ reset:function(form){ $(form).reset(); return form; }, serializeElements:function(elements,options){ if(typeof options!='object')options={hash:!!options}; else if(Object.isUndefined(options.hash))options.hash=true; var key,value,submitted=false,submit=options.submit; var data=elements.inject({},function(result,element){ if(!element.disabled&&element.name){ key=element.name;value=$(element).getValue(); if(value!=null&&element.type!='file'&&(element.type!='submit'||(!submitted&& submit!==false&&(!submit||key==submit)&&(submitted=true)))){ if(key in result){ if(!Object.isArray(result[key]))result[key]=[result[key]]; result[key].push(value); } else result[key]=value; } } return result; }); return options.hash?data:Object.toQueryString(data); } }; Form.Methods={ serialize:function(form,options){ return Form.serializeElements(Form.getElements(form),options); }, getElements:function(form){ return $A($(form).getElementsByTagName('*')).inject([], function(elements,child){ if(Form.Element.Serializers[child.tagName.toLowerCase()]) elements.push(Element.extend(child)); return elements; } ); }, getInputs:function(form,typeName,name){ form=$(form); var inputs=form.getElementsByTagName('input'); if(!typeName&&!name)return $A(inputs).map(Element.extend); for(var i=0,matchingInputs=[],length=inputs.length;i=0; }).sortBy(function(element){return element.tabIndex}).first(); return firstByIndex?firstByIndex:elements.find(function(element){ return['input','select','textarea'].include(element.tagName.toLowerCase()); }); }, focusFirstElement:function(form){ form=$(form); form.findFirstElement().activate(); return form; }, request:function(form,options){ form=$(form),options=Object.clone(options||{}); var params=options.parameters,action=form.readAttribute('action')||''; if(action.blank())action=window.location.href; options.parameters=form.serialize(true); if(params){ if(Object.isString(params))params=params.toQueryParams(); Object.extend(options.parameters,params); } if(form.hasAttribute('method')&&!options.method) options.method=form.method; return new Ajax.Request(action,options); } }; Form.Element={ focus:function(element){ $(element).focus(); return element; }, select:function(element){ $(element).select(); return element; } }; Form.Element.Methods={ serialize:function(element){ element=$(element); if(!element.disabled&&element.name){ var value=element.getValue(); if(value!=undefined){ var pair={}; pair[element.name]=value; return Object.toQueryString(pair); } } return''; }, getValue:function(element){ element=$(element); var method=element.tagName.toLowerCase(); return Form.Element.Serializers[method](element); }, setValue:function(element,value){ element=$(element); var method=element.tagName.toLowerCase(); Form.Element.Serializers[method](element,value); return element; }, clear:function(element){ $(element).value=''; return element; }, present:function(element){ return $(element).value!=''; }, activate:function(element){ element=$(element); try{ element.focus(); if(element.select&&(element.tagName.toLowerCase()!='input'|| !['button','reset','submit'].include(element.type))) element.select(); }catch(e){} return element; }, disable:function(element){ element=$(element); element.disabled=true; return element; }, enable:function(element){ element=$(element); element.disabled=false; return element; } }; var Field=Form.Element; var $F=Form.Element.Methods.getValue; Form.Element.Serializers={ input:function(element,value){ switch(element.type.toLowerCase()){ case'checkbox': case'radio': return Form.Element.Serializers.inputSelector(element,value); default: return Form.Element.Serializers.textarea(element,value); } }, inputSelector:function(element,value){ if(Object.isUndefined(value))return element.checked?element.value:null; else element.checked=!!value; }, textarea:function(element,value){ if(Object.isUndefined(value))return element.value; else element.value=value; }, select:function(element,value){ if(Object.isUndefined(value)) return this[element.type=='select-one'? 'selectOne':'selectMany'](element); else{ var opt,currentValue,single=!Object.isArray(value); for(var i=0,length=element.length;i=0?this.optionValue(element.options[index]):null; }, selectMany:function(element){ var values,length=element.length; if(!length)return null; for(var i=0,values=[];i<\/script>"); $("__onDOMContentLoaded").onreadystatechange=function(){ if(this.readyState=="complete"){ this.onreadystatechange=null; fireContentLoadedEvent(); } }; } })(); Hash.toQueryString=Object.toQueryString; var Toggle={display:Element.toggle}; Element.Methods.childOf=Element.Methods.descendantOf; var Insertion={ Before:function(element,content){ return Element.insert(element,{before:content}); }, Top:function(element,content){ return Element.insert(element,{top:content}); }, Bottom:function(element,content){ return Element.insert(element,{bottom:content}); }, After:function(element,content){ return Element.insert(element,{after:content}); } }; var $continue=new Error('"throw $continue" is deprecated, use "return" instead'); var Position={ includeScrollOffsets:false, prepare:function(){ this.deltaX=window.pageXOffset ||document.documentElement.scrollLeft ||document.body.scrollLeft ||0; this.deltaY=window.pageYOffset ||document.documentElement.scrollTop ||document.body.scrollTop ||0; }, within:function(element,x,y){ if(this.includeScrollOffsets) return this.withinIncludingScrolloffsets(element,x,y); this.xcomp=x; this.ycomp=y; this.offset=Element.cumulativeOffset(element); return(y>=this.offset[1]&& y=this.offset[0]&& x=this.offset[1]&& this.ycomp=this.offset[0]&& this.xcomp0; })._each(iterator); }, set:function(className){ this.element.className=className; }, add:function(classNameToAdd){ if(this.include(classNameToAdd))return; this.set($A(this).concat(classNameToAdd).join(' ')); }, remove:function(classNameToRemove){ if(!this.include(classNameToRemove))return; this.set($A(this).without(classNameToRemove).join(' ')); }, toString:function(){ return $A(this).join(' '); } }; Object.extend(Element.ClassNames.prototype,Enumerable); Element.addMethods(); var Validator = Class.create(); Validator.prototype = { initialize : function(className, error, test, options) { if(typeof test == 'function'){ this.options = $H(options); this._test = test; } else { this.options = $H(test); this._test = function(){return true}; } this.error = error || 'Validation failed.'; this.className = className; }, test : function(v, elm) { return (this._test(v,elm) && this.options.all(function(p){ return Validator.methods[p.key] ? Validator.methods[p.key](v,elm,p.value) : true; })); } } Validator.methods = { pattern : function(v,elm,opt) {return Validation.get('IsEmpty').test(v) || opt.test(v)}, minLength : function(v,elm,opt) {return v.length >= opt}, maxLength : function(v,elm,opt) {return v.length <= opt}, min : function(v,elm,opt) {return v >= parseFloat(opt)}, max : function(v,elm,opt) {return v <= parseFloat(opt)}, notOneOf : function(v,elm,opt) {return $A(opt).all(function(value) { return v != value; })}, oneOf : function(v,elm,opt) {return $A(opt).any(function(value) { return v == value; })}, is : function(v,elm,opt) {return v == opt}, isNot : function(v,elm,opt) {return v != opt}, equalToField : function(v,elm,opt) {return v == $F(opt)}, notEqualToField : function(v,elm,opt) {return v != $F(opt)}, include : function(v,elm,opt) {return $A(opt).all(function(value) { return Validation.get(value).test(v,elm); })} } var Validation = Class.create(); Validation.defaultOptions = { onSubmit : true, stopOnFirst : false, immediate : false, focusOnError : true, useTitles : false, addClassNameToContainer: false, containerClassName: '.input-box', onFormValidate : function(result, form) {}, onElementValidate : function(result, elm) {} }; Validation.prototype = { initialize : function(form, options){ this.form = $(form); if (!this.form) { return; } this.options = Object.extend({ onSubmit : Validation.defaultOptions.onSubmit, stopOnFirst : Validation.defaultOptions.stopOnFirst, immediate : Validation.defaultOptions.immediate, focusOnError : Validation.defaultOptions.focusOnError, useTitles : Validation.defaultOptions.useTitles, onFormValidate : Validation.defaultOptions.onFormValidate, onElementValidate : Validation.defaultOptions.onElementValidate }, options || {}); if(this.options.onSubmit) Event.observe(this.form,'submit',this.onSubmit.bind(this),false); if(this.options.immediate) { Form.getElements(this.form).each(function(input) { if (input.tagName.toLowerCase() == 'select') { Event.observe(input, 'blur', this.onChange.bindAsEventListener(this)); } Event.observe(input, 'change', this.onChange.bindAsEventListener(this)); }, this); } }, onChange : function (ev) { Validation.isOnChange = true; Validation.validate(Event.element(ev),{ useTitle : this.options.useTitles, onElementValidate : this.options.onElementValidate }); Validation.isOnChange = false; }, onSubmit : function(ev){ if(!this.validate()) Event.stop(ev); }, validate : function() { var result = false; var useTitles = this.options.useTitles; var callback = this.options.onElementValidate; try { if(this.options.stopOnFirst) { result = Form.getElements(this.form).all(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); }); } else { result = Form.getElements(this.form).collect(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); }).all(); } } catch (e) { } if(!result && this.options.focusOnError) { try{ Form.getElements(this.form).findAll(function(elm){return $(elm).hasClassName('validation-failed')}).first().focus() } catch(e){ } } this.options.onFormValidate(result, this.form); return result; }, reset : function() { Form.getElements(this.form).each(Validation.reset); } } Object.extend(Validation, { validate : function(elm, options){ options = Object.extend({ useTitle : false, onElementValidate : function(result, elm) {} }, options || {}); elm = $(elm); var cn = $w(elm.className); return result = cn.all(function(value) { var test = Validation.test(value,elm,options.useTitle); options.onElementValidate(test, elm); return test; }); }, insertAdvice : function(elm, advice){ var container = $(elm).up('.field-row'); if(container){ Element.insert(container, {after: advice}); } else if (elm.up('td.value')) { elm.up('td.value').insert({bottom: advice}); } else if (elm.advaiceContainer && $(elm.advaiceContainer)) { $(elm.advaiceContainer).update(advice); } else { switch (elm.type.toLowerCase()) { case 'checkbox': case 'radio': var p = elm.parentNode; if(p) { Element.insert(p, {'bottom': advice}); } else { Element.insert(elm, {'after': advice}); } break; default: Element.insert(elm, {'after': advice}); } } }, showAdvice : function(elm, advice, adviceName){ if(!elm.advices){ elm.advices = new Hash(); } else{ elm.advices.each(function(pair){ this.hideAdvice(elm, pair.value); }.bind(this)); } elm.advices.set(adviceName, advice); if(typeof Effect == 'undefined') { advice.style.display = 'block'; } else { if(!advice._adviceAbsolutize) { new Effect.Appear(advice, {duration : 1 }); } else { Position.absolutize(advice); advice.show(); advice.setStyle({ 'top':advice._adviceTop, 'left': advice._adviceLeft, 'width': advice._adviceWidth, 'z-index': 1000 }); advice.addClassName('advice-absolute'); } } }, hideAdvice : function(elm, advice){ if(advice != null) advice.hide(); }, updateCallback : function(elm, status) { if (typeof elm.callbackFunction != 'undefined') { eval(elm.callbackFunction+'(\''+elm.id+'\',\''+status+'\')'); } }, ajaxError : function(elm, errorMsg) { var name = 'validate-ajax'; var advice = Validation.getAdvice(name, elm); if (advice == null) { advice = this.createAdvice(name, elm, false, errorMsg); } this.showAdvice(elm, advice, 'validate-ajax'); this.updateCallback(elm, 'failed'); elm.addClassName('validation-failed'); elm.addClassName('validate-ajax'); if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') { var container = elm.up(Validation.defaultOptions.containerClassName); if (container && this.allowContainerClassName(elm)) { container.removeClassName('validation-passed'); container.addClassName('validation-error'); } } }, allowContainerClassName: function (elm) { if (elm.type == 'radio' || elm.type == 'checkbox') { return elm.hasClassName('change-container-classname'); } return true; }, test : function(name, elm, useTitle) { var v = Validation.get(name); var prop = '__advice'+name.camelize(); try { if(Validation.isVisible(elm) && !v.test($F(elm), elm)) { //if(!elm[prop]) { var advice = Validation.getAdvice(name, elm); if (advice == null) { advice = this.createAdvice(name, elm, useTitle); } this.showAdvice(elm, advice, name); this.updateCallback(elm, 'failed'); //} elm[prop] = 1; if (!elm.advaiceContainer) { elm.removeClassName('validation-passed'); elm.addClassName('validation-failed'); } if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') { var container = elm.up(Validation.defaultOptions.containerClassName); if (container && this.allowContainerClassName(elm)) { container.removeClassName('validation-passed'); container.addClassName('validation-error'); } } return false; } else { var advice = Validation.getAdvice(name, elm); this.hideAdvice(elm, advice); this.updateCallback(elm, 'passed'); elm[prop] = ''; elm.removeClassName('validation-failed'); elm.addClassName('validation-passed'); if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') { var container = elm.up(Validation.defaultOptions.containerClassName); if (container && !container.down('.validation-failed') && this.allowContainerClassName(elm)) { if (!Validation.get('IsEmpty').test(elm.value) || !this.isVisible(elm)) { container.addClassName('validation-passed'); } else { container.removeClassName('validation-passed'); } container.removeClassName('validation-error'); } } return true; } } catch(e) { throw(e) } }, isVisible : function(elm) { while(elm.tagName != 'BODY') { if(!$(elm).visible()) return false; elm = elm.parentNode; } return true; }, getAdvice : function(name, elm) { return $('advice-' + name + '-' + Validation.getElmID(elm)) || $('advice-' + Validation.getElmID(elm)); }, createAdvice : function(name, elm, useTitle, customError) { var v = Validation.get(name); var errorMsg = useTitle ? ((elm && elm.title) ? elm.title : v.error) : v.error; if (customError) { errorMsg = customError; } try { if (Translator){ errorMsg = Translator.translate(errorMsg); } } catch(e){} advice = '' Validation.insertAdvice(elm, advice); advice = Validation.getAdvice(name, elm); if($(elm).hasClassName('absolute-advice')) { var dimensions = $(elm).getDimensions(); var originalPosition = Position.cumulativeOffset(elm); advice._adviceTop = (originalPosition[1] + dimensions.height) + 'px'; advice._adviceLeft = (originalPosition[0]) + 'px'; advice._adviceWidth = (dimensions.width) + 'px'; advice._adviceAbsolutize = true; } return advice; }, getElmID : function(elm) { return elm.id ? elm.id : elm.name; }, reset : function(elm) { elm = $(elm); var cn = $w(elm.className); cn.each(function(value) { var prop = '__advice'+value.camelize(); if(elm[prop]) { var advice = Validation.getAdvice(value, elm); if (advice) { advice.hide(); } elm[prop] = ''; } elm.removeClassName('validation-failed'); elm.removeClassName('validation-passed'); if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') { var container = elm.up(Validation.defaultOptions.containerClassName); if (container) { container.removeClassName('validation-passed'); container.removeClassName('validation-error'); } } }); }, add : function(className, error, test, options) { var nv = {}; nv[className] = new Validator(className, error, test, options); Object.extend(Validation.methods, nv); }, addAllThese : function(validators) { var nv = {}; $A(validators).each(function(value) { nv[value[0]] = new Validator(value[0], value[1], value[2], (value.length > 3 ? value[3] : {})); }); Object.extend(Validation.methods, nv); }, get : function(name) { return Validation.methods[name] ? Validation.methods[name] : Validation.methods['_LikeNoIDIEverSaw_']; }, methods : { '_LikeNoIDIEverSaw_' : new Validator('_LikeNoIDIEverSaw_','',{}) } }); Validation.add('IsEmpty', '', function(v) { return (v == '' || (v == null) || (v.length == 0) || /^\s+$/.test(v)); // || /^\s+$/.test(v)); }); Validation.addAllThese([ ['validate-select', 'Please select an option.', function(v) { return ((v != "none") && (v != null) && (v.length != 0)); }], ['required-entry', 'This is a required field.', function(v) { return !Validation.get('IsEmpty').test(v); }], ['validate-number', 'Please enter a valid number in this field.', function(v) { return Validation.get('IsEmpty').test(v) || (!isNaN(parseNumber(v)) && !/^\s+$/.test(parseNumber(v))); }], ['validate-digits', 'Please use numbers only in this field. please avoid spaces or other characters such as dots or commas.', function(v) { return Validation.get('IsEmpty').test(v) || !/[^\d]/.test(v); }], ['validate-alpha', 'Please use letters only (a-z or A-Z) in this field.', function (v) { return Validation.get('IsEmpty').test(v) || /^[a-zA-Z]+$/.test(v) }], ['validate-code', 'Please use only letters (a-z), numbers (0-9) or underscore(_) in this field, first character should be a letter.', function (v) { return Validation.get('IsEmpty').test(v) || /^[a-z]+[a-z0-9_]+$/.test(v) }], ['validate-alphanum', 'Please use only letters (a-z or A-Z) or numbers (0-9) only in this field. No spaces or other characters are allowed.', function(v) { return Validation.get('IsEmpty').test(v) || /^[a-zA-Z0-9]+$/.test(v) /*!/\W/.test(v)*/ }], ['validate-street', 'Please use only letters (a-z or A-Z) or numbers (0-9) or spaces and # only in this field.', function(v) { return Validation.get('IsEmpty').test(v) || /^[ \w]{3,}([A-Za-z]\.)?([ \w]*\#\d+)?(\r\n| )[ \w]{3,}/.test(v) }], ['validate-phoneStrict', 'Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.', function(v) { return Validation.get('IsEmpty').test(v) || /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(v); }], ['validate-phoneLax', 'Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.', function(v) { return Validation.get('IsEmpty').test(v) || /^((\d[-. ]?)?((\(\d{3}\))|\d{3}))?[-. ]?\d{3}[-. ]?\d{4}$/.test(v); }], ['validate-fax', 'Please enter a valid fax number. For example (123) 456-7890 or 123-456-7890.', function(v) { return Validation.get('IsEmpty').test(v) || /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(v); }], ['validate-date', 'Please enter a valid date.', function(v) { var test = new Date(v); return Validation.get('IsEmpty').test(v) || !isNaN(test); }], ['validate-email', 'Please enter a valid email address. For example johndoe@domain.com.', function (v) { //return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v) //return Validation.get('IsEmpty').test(v) || /^[\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9][\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9\.]{1,30}[\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9]@([a-z0-9_-]{1,30}\.){1,5}[a-z]{2,4}$/i.test(v) return Validation.get('IsEmpty').test(v) || /^[a-z0-9,!\#\$%&'\*\+/=\?\^_`\{\|}~-]+(\.[a-z0-9,!#\$%&'\*\+/=\?\^_`\{\|}~-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.([a-z]{2,})/i.test(v) }], ['validate-emailSender', 'Please use only letters (a-z or A-Z), numbers (0-9) , underscore(_) or spaces in this field.', function (v) { return Validation.get('IsEmpty').test(v) || /^[a-zA-Z0-9_\s]+$/.test(v) }], ['validate-password', 'Please enter 6 or more characters. Leading or trailing spaces will be ignored.', function(v) { var pass=v.strip(); /*strip leading and trailing spaces*/ return !(pass.length>0 && pass.length < 6); }], ['validate-admin-password', 'Please enter 7 or more characters. Password should contain both numeric and alphabetic characters.', function(v) { var pass=v.strip(); if (0 == pass.length) { return true; } if (!(/[a-z]/i.test(v)) || !(/[0-9]/.test(v))) { return false; } return !(pass.length < 7); }], ['validate-cpassword', 'Please make sure your passwords match.', function(v) { if ($('password')) { var pass = $('password'); } else { var pass = $$('.validate-password').length ? $$('.validate-password')[0] : $$('.validate-admin-password')[0]; } var conf = $('confirmation') ? $('confirmation') : $$('.validate-cpassword')[0]; return (pass.value == conf.value); }], ['validate-url', 'Please enter a valid URL. http:// is required', function (v) { return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v) }], ['validate-clean-url', 'Please enter a valid URL. For example http://www.example.com or www.example.com', function (v) { return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v) || /^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v) }], ['validate-identifier', 'Please enter a valid Identifier. For example example-page, example-page.html or anotherlevel/example-page', function (v) { return Validation.get('IsEmpty').test(v) || /^[A-Z0-9][A-Z0-9_\/-]+(\.[A-Z0-9_-]+)*$/i.test(v) }], ['validate-xml-identifier', 'Please enter a valid XML-identifier. For example something_1, block5, id-4', function (v) { return Validation.get('IsEmpty').test(v) || /^[A-Z][A-Z0-9_\/-]*$/i.test(v) }], ['validate-ssn', 'Please enter a valid social security number. For example 123-45-6789.', function(v) { return Validation.get('IsEmpty').test(v) || /^\d{3}-?\d{2}-?\d{4}$/.test(v); }], ['validate-zip', 'Please enter a valid zip code. For example 90602 or 90602-1234.', function(v) { return Validation.get('IsEmpty').test(v) || /(^\d{5}$)|(^\d{5}-\d{4}$)/.test(v); }], ['validate-zip-international', 'Please enter a valid zip code.', function(v) { //return Validation.get('IsEmpty').test(v) || /(^[A-z0-9]{2,10}([\s]{0,1}|[\-]{0,1})[A-z0-9]{2,10}$)/.test(v); return true; }], ['validate-date-au', 'Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.', function(v) { if(Validation.get('IsEmpty').test(v)) return true; var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/; if(!regex.test(v)) return false; var d = new Date(v.replace(regex, '$2/$1/$3')); return ( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) && (parseInt(RegExp.$1, 10) == d.getDate()) && (parseInt(RegExp.$3, 10) == d.getFullYear() ); }], ['validate-currency-dollar', 'Please enter a valid $ amount. For example $100.00.', function(v) { // [$]1[##][,###]+[.##] // [$]1###+[.##] // [$]0.## // [$].## return Validation.get('IsEmpty').test(v) || /^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v) }], ['validate-one-required', 'Please select one of the above options.', function (v,elm) { var p = elm.parentNode; var options = p.getElementsByTagName('INPUT'); return $A(options).any(function(elm) { return $F(elm); }); }], ['validate-one-required-by-name', 'Please select one of the options.', function (v,elm) { var inputs = $$('input[name="' + elm.name.replace(/([\\"])/g, '\\$1') + '"]'); var error = 1; for(var i=0;i=0); }], ['validate-state', 'Please select State/Province.', function(v) { return (v!=0 || v == ''); }], ['validate-new-password', 'Please enter 6 or more characters. Leading or trailing spaces will be ignored.', function(v) { if (!Validation.get('validate-password').test(v)) return false; if (Validation.get('IsEmpty').test(v) && v != '') return false; return true; }], ['validate-greater-than-zero', 'Please enter a number greater than 0 in this field.', function(v) { if(v.length) return parseFloat(v) > 0; else return true; }], ['validate-zero-or-greater', 'Please enter a number 0 or greater in this field.', function(v) { if(v.length) return parseFloat(v) >= 0; else return true; }], ['validate-cc-number', 'Please enter a valid credit card number.', function(v, elm) { var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_number')) + '_cc_type'); if (ccTypeContainer && typeof Validation.creditCartTypes.get(ccTypeContainer.value) != 'undefined' && Validation.creditCartTypes.get(ccTypeContainer.value)[2] == false) { if (!Validation.get('IsEmpty').test(v) && Validation.get('validate-digits').test(v)) { return true; } else { return false; } } return validateCreditCard(v); }], ['validate-cc-type', 'Credit card number doesn\'t match credit card type', function(v, elm) { elm.value = removeDelimiters(elm.value); v = removeDelimiters(v); var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_number')) + '_cc_type'); if (!ccTypeContainer) { return true; } var ccType = ccTypeContainer.value; if (typeof Validation.creditCartTypes.get(ccType) == 'undefined') { return false; } if (Validation.creditCartTypes.get(ccType)[0]==false) { return true; } var ccMatchedType = ''; Validation.creditCartTypes.each(function (pair) { if (pair.value[0] && v.match(pair.value[0])) { ccMatchedType = pair.key; throw $break; } }); if(ccMatchedType != ccType) { return false; } if (ccTypeContainer.hasClassName('validation-failed') && Validation.isOnChange) { Validation.validate(ccTypeContainer); } return true; }], ['validate-cc-type-select', 'Card type doesn\'t match credit card number', function(v, elm) { var ccNumberContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_type')) + '_cc_number'); if (Validation.isOnChange && Validation.get('IsEmpty').test(ccNumberContainer.value)) { return true; } if (Validation.get('validate-cc-type').test(ccNumberContainer.value, ccNumberContainer)) { Validation.validate(ccNumberContainer); } return Validation.get('validate-cc-type').test(ccNumberContainer.value, ccNumberContainer); }], ['validate-cc-exp', 'Incorrect credit card expiration date', function(v, elm) { var ccExpMonth = v; var ccExpYear = $('ccsave_expiration_yr').value; var currentTime = new Date(); var currentMonth = currentTime.getMonth() + 1; var currentYear = currentTime.getFullYear(); if (ccExpMonth < currentMonth && ccExpYear == currentYear) { return false; } return true; }], ['validate-cc-cvn', 'Please enter a valid credit card verification number.', function(v, elm) { var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_cid')) + '_cc_type'); if (!ccTypeContainer) { return true; } var ccType = ccTypeContainer.value; if (typeof Validation.creditCartTypes.get(ccType) == 'undefined') { return false; } var re = Validation.creditCartTypes.get(ccType)[1]; if (v.match(re)) { return true; } return false; }], ['validate-ajax', '', function(v, elm) { return true; }], ['validate-data', 'Please use only letters (a-z or A-Z), numbers (0-9) or underscore(_) in this field, first character should be a letter.', function (v) { if(v != '' && v) { return /^[A-Za-z]+[A-Za-z0-9_]+$/.test(v); } return true; }], ['validate-css-length', 'Please input a valid CSS-length. For example 100px or 77pt or 20em or .5ex or 50%', function (v) { if (v != '' && v) { return /^[0-9\.]+(px|pt|em|ex|%)?$/.test(v) && (!(/\..*\./.test(v))) && !(/\.$/.test(v)); } return true; }], ['validate-length', 'Maximum length exceeded.', function (v, elm) { var re = new RegExp(/^maximum-length-[0-9]+$/); var result = true; $w(elm.className).each(function(name, index) { if (name.match(re) && result) { var length = name.split('-')[2]; result = (v.length <= length); } }); return result; }] ]); function validateCreditCard(s) { var v = "0123456789"; var w = ""; for (i=0; i < s.length; i++) { x = s.charAt(i); if (v.indexOf(x,0) != -1) w += x; } j = w.length / 2; k = Math.floor(j); m = Math.ceil(j) - k; c = 0; for (i=0; i 9 ? Math.floor(a/10 + a%10) : a; } for (i=0; i isDot) { v = v.replace('.', '').replace(',', '.'); } else { v = v.replace(',', ''); } } else if (isComa != -1) { v = v.replace(',', '.'); } return parseFloat(v); } Validation.creditCartTypes = $H({ 'VI': [new RegExp('^4[0-9]{12}([0-9]{3})?$'), new RegExp('^[0-9]{3}$'), true], 'MC': [new RegExp('^5[1-5][0-9]{14}$'), new RegExp('^[0-9]{3}$'), true], 'AE': [new RegExp('^3[47][0-9]{13}$'), new RegExp('^[0-9]{4}$'), true], 'DI': [new RegExp('^6011[0-9]{12}$'), new RegExp('^[0-9]{3}$'), true], 'SS': [new RegExp('^((6759[0-9]{12})|(49[013][1356][0-9]{13})|(633[34][0-9]{12})|(633110[0-9]{10})|(564182[0-9]{10}))([0-9]{2,3})?$'), new RegExp('^([0-9]{3}|[0-9]{4})?$'), true], 'OT': [false, new RegExp('^([0-9]{3}|[0-9]{4})?$'), false] }); var Builder={ NODEMAP:{ AREA:'map', CAPTION:'table', COL:'table', COLGROUP:'table', LEGEND:'fieldset', OPTGROUP:'select', OPTION:'select', PARAM:'object', TBODY:'table', TD:'table', TFOOT:'table', TH:'table', THEAD:'table', TR:'table' }, node:function(elementName){ elementName=elementName.toUpperCase(); var parentTag=this.NODEMAP[elementName]||'div'; var parentElement=document.createElement(parentTag); try{ parentElement.innerHTML="<"+elementName+">"; }catch(e){} var element=parentElement.firstChild||null; if(element&&(element.tagName.toUpperCase()!=elementName)) element=element.getElementsByTagName(elementName)[0]; if(!element)element=document.createElement(elementName); if(!element)return; if(arguments[1]) if(this._isStringOrNumber(arguments[1])|| (arguments[1]instanceof Array)|| arguments[1].tagName){ this._children(element,arguments[1]); }else{ var attrs=this._attributes(arguments[1]); if(attrs.length){ try{ parentElement.innerHTML="<"+elementName+" "+ attrs+">"; }catch(e){} element=parentElement.firstChild||null; if(!element){ element=document.createElement(elementName); for(attr in arguments[1]) element[attr=='class'?'className':attr]=arguments[1][attr]; } if(element.tagName.toUpperCase()!=elementName) element=parentElement.getElementsByTagName(elementName)[0]; } } if(arguments[2]) this._children(element,arguments[2]); return $(element); }, _text:function(text){ return document.createTextNode(text); }, ATTR_MAP:{ 'className':'class', 'htmlFor':'for' }, _attributes:function(attributes){ var attrs=[]; for(attribute in attributes) attrs.push((attribute in this.ATTR_MAP?this.ATTR_MAP[attribute]:attribute)+ '="'+attributes[attribute].toString().escapeHTML().gsub(/"/,'"')+'"'); return attrs.join(" "); }, _children:function(element,children){ if(children.tagName){ element.appendChild(children); return; } if(typeof children=='object'){ children.flatten().each(function(e){ if(typeof e=='object') element.appendChild(e); else if(Builder._isStringOrNumber(e)) element.appendChild(Builder._text(e)); }); }else if(Builder._isStringOrNumber(children)) element.appendChild(Builder._text(children)); }, _isStringOrNumber:function(param){ return(typeof param=='string'||typeof param=='number'); }, build:function(html){ var element=this.node('div'); $(element).update(html.strip()); return element.down(); }, dump:function(scope){ if(typeof scope!='object'&&typeof scope!='function')scope=window; var tags=("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY "+ "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET "+ "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+ "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+ "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+ "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/); tags.each(function(tag){ scope[tag]=function(){ return Builder.node.apply(Builder,[tag].concat($A(arguments))); }; }); } }; String.prototype.parseColor=function(){ var color='#'; if(this.slice(0,4)=='rgb('){ var cols=this.slice(4,this.length-1).split(','); var i=0;do{color+=parseInt(cols[i]).toColorPart()}while(++i<3); }else{ if(this.slice(0,1)=='#'){ if(this.length==4)for(var i=1;i<4;i++)color+=(this.charAt(i)+this.charAt(i)).toLowerCase(); if(this.length==7)color=this.toLowerCase(); } } return(color.length==7?color:(arguments[0]||this)); }; Element.collectTextNodes=function(element){ return $A($(element).childNodes).collect(function(node){ return(node.nodeType==3?node.nodeValue: (node.hasChildNodes()?Element.collectTextNodes(node):'')); }).flatten().join(''); }; Element.collectTextNodesIgnoreClass=function(element,className){ return $A($(element).childNodes).collect(function(node){ return(node.nodeType==3?node.nodeValue: ((node.hasChildNodes()&&!Element.hasClassName(node,className))? Element.collectTextNodesIgnoreClass(node,className):'')); }).flatten().join(''); }; Element.setContentZoom=function(element,percent){ element=$(element); element.setStyle({fontSize:(percent/100)+'em'}); if(Prototype.Browser.WebKit)window.scrollBy(0,0); return element; }; Element.getInlineOpacity=function(element){ return $(element).style.opacity||''; }; Element.forceRerendering=function(element){ try{ element=$(element); var n=document.createTextNode(' '); element.appendChild(n); element.removeChild(n); }catch(e){} }; var Effect={ _elementDoesNotExistError:{ name:'ElementDoesNotExistError', message:'The specified DOM element does not exist, but is required for this effect to operate' }, Transitions:{ linear:Prototype.K, sinoidal:function(pos){ return(-Math.cos(pos*Math.PI)/2)+.5; }, reverse:function(pos){ return 1-pos; }, flicker:function(pos){ var pos=((-Math.cos(pos*Math.PI)/4)+.75)+Math.random()/4; return pos>1?1:pos; }, wobble:function(pos){ return(-Math.cos(pos*Math.PI*(9*pos))/2)+.5; }, pulse:function(pos,pulses){ return(-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2)+.5; }, spring:function(pos){ return 1-(Math.cos(pos*4.5*Math.PI)*Math.exp(-pos*6)); }, none:function(pos){ return 0; }, full:function(pos){ return 1; } }, DefaultOptions:{ duration:1.0, fps:100, sync:false, from:0.0, to:1.0, delay:0.0, queue:'parallel' }, tagifyText:function(element){ var tagifyStyle='position:relative'; if(Prototype.Browser.IE)tagifyStyle+=';zoom:1'; element=$(element); $A(element.childNodes).each(function(child){ if(child.nodeType==3){ child.nodeValue.toArray().each(function(character){ element.insertBefore( new Element('span',{style:tagifyStyle}).update( character==' '?String.fromCharCode(160):character), child); }); Element.remove(child); } }); }, multiple:function(element,effect){ var elements; if(((typeof element=='object')|| Object.isFunction(element))&& (element.length)) elements=element; else elements=$(element).childNodes; var options=Object.extend({ speed:0.1, delay:0.0 },arguments[2]||{}); var masterDelay=options.delay; $A(elements).each(function(element,index){ new effect(element,Object.extend(options,{delay:index*options.speed+masterDelay})); }); }, PAIRS:{ 'slide':['SlideDown','SlideUp'], 'blind':['BlindDown','BlindUp'], 'appear':['Appear','Fade'] }, toggle:function(element,effect){ element=$(element); effect=(effect||'appear').toLowerCase(); var options=Object.extend({ queue:{position:'end',scope:(element.id||'global'),limit:1} },arguments[2]||{}); Effect[element.visible()? Effect.PAIRS[effect][1]:Effect.PAIRS[effect][0]](element,options); } }; Effect.DefaultOptions.transition=Effect.Transitions.sinoidal; Effect.ScopedQueue=Class.create(Enumerable,{ initialize:function(){ this.effects=[]; this.interval=null; }, _each:function(iterator){ this.effects._each(iterator); }, add:function(effect){ var timestamp=new Date().getTime(); var position=Object.isString(effect.options.queue)? effect.options.queue:effect.options.queue.position; switch(position){ case'front': this.effects.findAll(function(e){return e.state=='idle'}).each(function(e){ e.startOn+=effect.finishOn; e.finishOn+=effect.finishOn; }); break; case'with-last': timestamp=this.effects.pluck('startOn').max()||timestamp; break; case'end': timestamp=this.effects.pluck('finishOn').max()||timestamp; break; } effect.startOn+=timestamp; effect.finishOn+=timestamp; if(!effect.options.queue.limit||(this.effects.length=this.startOn){ if(timePos>=this.finishOn){ this.render(1.0); this.cancel(); this.event('beforeFinish'); if(this.finish)this.finish(); this.event('afterFinish'); return; } var pos=(timePos-this.startOn)/this.totalTime, frame=(pos*this.totalFrames).round(); if(frame>this.currentFrame){ this.render(pos); this.currentFrame=frame; } } }, cancel:function(){ if(!this.options.sync) Effect.Queues.get(Object.isString(this.options.queue)? 'global':this.options.queue.scope).remove(this); this.state='finished'; }, event:function(eventName){ if(this.options[eventName+'Internal'])this.options[eventName+'Internal'](this); if(this.options[eventName])this.options[eventName](this); }, inspect:function(){ var data=$H(); for(property in this) if(!Object.isFunction(this[property]))data.set(property,this[property]); return'#'; } }); Effect.Parallel=Class.create(Effect.Base,{ initialize:function(effects){ this.effects=effects||[]; this.start(arguments[1]); }, update:function(position){ this.effects.invoke('render',position); }, finish:function(position){ this.effects.each(function(effect){ effect.render(1.0); effect.cancel(); effect.event('beforeFinish'); if(effect.finish)effect.finish(position); effect.event('afterFinish'); }); } }); Effect.Tween=Class.create(Effect.Base,{ initialize:function(object,from,to){ object=Object.isString(object)?$(object):object; var args=$A(arguments),method=args.last(), options=args.length==5?args[3]:null; this.method=Object.isFunction(method)?method.bind(object): Object.isFunction(object[method])?object[method].bind(object): function(value){object[method]=value}; this.start(Object.extend({from:from,to:to},options||{})); }, update:function(position){ this.method(position); } }); Effect.Event=Class.create(Effect.Base,{ initialize:function(){ this.start(Object.extend({duration:0},arguments[0]||{})); }, update:Prototype.emptyFunction }); Effect.Opacity=Class.create(Effect.Base,{ initialize:function(element){ this.element=$(element); if(!this.element)throw(Effect._elementDoesNotExistError); if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout)) this.element.setStyle({zoom:1}); var options=Object.extend({ from:this.element.getOpacity()||0.0, to:1.0 },arguments[1]||{}); this.start(options); }, update:function(position){ this.element.setOpacity(position); } }); Effect.Move=Class.create(Effect.Base,{ initialize:function(element){ this.element=$(element); if(!this.element)throw(Effect._elementDoesNotExistError); var options=Object.extend({ x:0, y:0, mode:'relative' },arguments[1]||{}); this.start(options); }, setup:function(){ this.element.makePositioned(); this.originalLeft=parseFloat(this.element.getStyle('left')||'0'); this.originalTop=parseFloat(this.element.getStyle('top')||'0'); if(this.options.mode=='absolute'){ this.options.x=this.options.x-this.originalLeft; this.options.y=this.options.y-this.originalTop; } }, update:function(position){ this.element.setStyle({ left:(this.options.x*position+this.originalLeft).round()+'px', top:(this.options.y*position+this.originalTop).round()+'px' }); } }); Effect.MoveBy=function(element,toTop,toLeft){ return new Effect.Move(element, Object.extend({x:toLeft,y:toTop},arguments[3]||{})); }; Effect.Scale=Class.create(Effect.Base,{ initialize:function(element,percent){ this.element=$(element); if(!this.element)throw(Effect._elementDoesNotExistError); var options=Object.extend({ scaleX:true, scaleY:true, scaleContent:true, scaleFromCenter:false, scaleMode:'box', scaleFrom:100.0, scaleTo:percent },arguments[2]||{}); this.start(options); }, setup:function(){ this.restoreAfterFinish=this.options.restoreAfterFinish||false; this.elementPositioning=this.element.getStyle('position'); this.originalStyle={}; ['top','left','width','height','fontSize'].each(function(k){ this.originalStyle[k]=this.element.style[k]; }.bind(this)); this.originalTop=this.element.offsetTop; this.originalLeft=this.element.offsetLeft; var fontSize=this.element.getStyle('font-size')||'100%'; ['em','px','%','pt'].each(function(fontSizeType){ if(fontSize.indexOf(fontSizeType)>0){ this.fontSize=parseFloat(fontSize); this.fontSizeType=fontSizeType; } }.bind(this)); this.factor=(this.options.scaleTo-this.options.scaleFrom)/100; this.dims=null; if(this.options.scaleMode=='box') this.dims=[this.element.offsetHeight,this.element.offsetWidth]; if(/^content/.test(this.options.scaleMode)) this.dims=[this.element.scrollHeight,this.element.scrollWidth]; if(!this.dims) this.dims=[this.options.scaleMode.originalHeight, this.options.scaleMode.originalWidth]; }, update:function(position){ var currentScale=(this.options.scaleFrom/100.0)+(this.factor*position); if(this.options.scaleContent&&this.fontSize) this.element.setStyle({fontSize:this.fontSize*currentScale+this.fontSizeType}); this.setDimensions(this.dims[0]*currentScale,this.dims[1]*currentScale); }, finish:function(position){ if(this.restoreAfterFinish)this.element.setStyle(this.originalStyle); }, setDimensions:function(height,width){ var d={}; if(this.options.scaleX)d.width=width.round()+'px'; if(this.options.scaleY)d.height=height.round()+'px'; if(this.options.scaleFromCenter){ var topd=(height-this.dims[0])/2; var leftd=(width-this.dims[1])/2; if(this.elementPositioning=='absolute'){ if(this.options.scaleY)d.top=this.originalTop-topd+'px'; if(this.options.scaleX)d.left=this.originalLeft-leftd+'px'; }else{ if(this.options.scaleY)d.top=-topd+'px'; if(this.options.scaleX)d.left=-leftd+'px'; } } this.element.setStyle(d); } }); Effect.Highlight=Class.create(Effect.Base,{ initialize:function(element){ this.element=$(element); if(!this.element)throw(Effect._elementDoesNotExistError); var options=Object.extend({startcolor:'#ffff99'},arguments[1]||{}); this.start(options); }, setup:function(){ if(this.element.getStyle('display')=='none'){this.cancel();return;} this.oldStyle={}; if(!this.options.keepBackgroundImage){ this.oldStyle.backgroundImage=this.element.getStyle('background-image'); this.element.setStyle({backgroundImage:'none'}); } if(!this.options.endcolor) this.options.endcolor=this.element.getStyle('background-color').parseColor('#ffffff'); if(!this.options.restorecolor) this.options.restorecolor=this.element.getStyle('background-color'); this._base=$R(0,2).map(function(i){return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16)}.bind(this)); this._delta=$R(0,2).map(function(i){return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i]}.bind(this)); }, update:function(position){ this.element.setStyle({backgroundColor:$R(0,2).inject('#',function(m,v,i){ return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart());}.bind(this))}); }, finish:function(){ this.element.setStyle(Object.extend(this.oldStyle,{ backgroundColor:this.options.restorecolor })); } }); Effect.ScrollTo=function(element){ var options=arguments[1]||{}, scrollOffsets=document.viewport.getScrollOffsets(), elementOffsets=$(element).cumulativeOffset(); if(options.offset)elementOffsets[1]+=options.offset; return new Effect.Tween(null, scrollOffsets.top, elementOffsets[1], options, function(p){scrollTo(scrollOffsets.left,p.round());} ); }; Effect.Fade=function(element){ element=$(element); var oldOpacity=element.getInlineOpacity(); var options=Object.extend({ from:element.getOpacity()||1.0, to:0.0, afterFinishInternal:function(effect){ if(effect.options.to!=0)return; effect.element.hide().setStyle({opacity:oldOpacity}); } },arguments[1]||{}); return new Effect.Opacity(element,options); }; Effect.Appear=function(element){ element=$(element); var options=Object.extend({ from:(element.getStyle('display')=='none'?0.0:element.getOpacity()||0.0), to:1.0, afterFinishInternal:function(effect){ effect.element.forceRerendering(); }, beforeSetup:function(effect){ effect.element.setOpacity(effect.options.from).show(); }},arguments[1]||{}); return new Effect.Opacity(element,options); }; Effect.Puff=function(element){ element=$(element); var oldStyle={ opacity:element.getInlineOpacity(), position:element.getStyle('position'), top:element.style.top, left:element.style.left, width:element.style.width, height:element.style.height }; return new Effect.Parallel( [new Effect.Scale(element,200, {sync:true,scaleFromCenter:true,scaleContent:true,restoreAfterFinish:true}), new Effect.Opacity(element,{sync:true,to:0.0})], Object.extend({duration:1.0, beforeSetupInternal:function(effect){ Position.absolutize(effect.effects[0].element); }, afterFinishInternal:function(effect){ effect.effects[0].element.hide().setStyle(oldStyle);} },arguments[1]||{}) ); }; Effect.BlindUp=function(element){ element=$(element); element.makeClipping(); return new Effect.Scale(element,0, Object.extend({scaleContent:false, scaleX:false, restoreAfterFinish:true, afterFinishInternal:function(effect){ effect.element.hide().undoClipping(); } },arguments[1]||{}) ); }; Effect.BlindDown=function(element){ element=$(element); var elementDimensions=element.getDimensions(); return new Effect.Scale(element,100,Object.extend({ scaleContent:false, scaleX:false, scaleFrom:0, scaleMode:{originalHeight:elementDimensions.height,originalWidth:elementDimensions.width}, restoreAfterFinish:true, afterSetup:function(effect){ effect.element.makeClipping().setStyle({height:'0px'}).show(); }, afterFinishInternal:function(effect){ effect.element.undoClipping(); } },arguments[1]||{})); }; Effect.SwitchOff=function(element){ element=$(element); var oldOpacity=element.getInlineOpacity(); return new Effect.Appear(element,Object.extend({ duration:0.4, from:0, transition:Effect.Transitions.flicker, afterFinishInternal:function(effect){ new Effect.Scale(effect.element,1,{ duration:0.3,scaleFromCenter:true, scaleX:false,scaleContent:false,restoreAfterFinish:true, beforeSetup:function(effect){ effect.element.makePositioned().makeClipping(); }, afterFinishInternal:function(effect){ effect.element.hide().undoClipping().undoPositioned().setStyle({opacity:oldOpacity}); } }); } },arguments[1]||{})); }; Effect.DropOut=function(element){ element=$(element); var oldStyle={ top:element.getStyle('top'), left:element.getStyle('left'), opacity:element.getInlineOpacity()}; return new Effect.Parallel( [new Effect.Move(element,{x:0,y:100,sync:true}), new Effect.Opacity(element,{sync:true,to:0.0})], Object.extend( {duration:0.5, beforeSetup:function(effect){ effect.effects[0].element.makePositioned(); }, afterFinishInternal:function(effect){ effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); } },arguments[1]||{})); }; Effect.Shake=function(element){ element=$(element); var options=Object.extend({ distance:20, duration:0.5 },arguments[1]||{}); var distance=parseFloat(options.distance); var split=parseFloat(options.duration)/10.0; var oldStyle={ top:element.getStyle('top'), left:element.getStyle('left')}; return new Effect.Move(element, {x:distance,y:0,duration:split,afterFinishInternal:function(effect){ new Effect.Move(effect.element, {x:-distance*2,y:0,duration:split*2,afterFinishInternal:function(effect){ new Effect.Move(effect.element, {x:distance*2,y:0,duration:split*2,afterFinishInternal:function(effect){ new Effect.Move(effect.element, {x:-distance*2,y:0,duration:split*2,afterFinishInternal:function(effect){ new Effect.Move(effect.element, {x:distance*2,y:0,duration:split*2,afterFinishInternal:function(effect){ new Effect.Move(effect.element, {x:-distance,y:0,duration:split,afterFinishInternal:function(effect){ effect.element.undoPositioned().setStyle(oldStyle); }});}});}});}});}});}}); }; Effect.SlideDown=function(element){ element=$(element).cleanWhitespace(); var oldInnerBottom=element.down().getStyle('bottom'); var elementDimensions=element.getDimensions(); return new Effect.Scale(element,100,Object.extend({ scaleContent:false, scaleX:false, scaleFrom:window.opera?0:1, scaleMode:{originalHeight:elementDimensions.height,originalWidth:elementDimensions.width}, restoreAfterFinish:true, afterSetup:function(effect){ effect.element.makePositioned(); effect.element.down().makePositioned(); if(window.opera)effect.element.setStyle({top:''}); effect.element.makeClipping().setStyle({height:'0px'}).show(); }, afterUpdateInternal:function(effect){ effect.element.down().setStyle({bottom: (effect.dims[0]-effect.element.clientHeight)+'px'}); }, afterFinishInternal:function(effect){ effect.element.undoClipping().undoPositioned(); effect.element.down().undoPositioned().setStyle({bottom:oldInnerBottom});} },arguments[1]||{}) ); }; Effect.SlideUp=function(element){ element=$(element).cleanWhitespace(); var oldInnerBottom=element.down().getStyle('bottom'); var elementDimensions=element.getDimensions(); return new Effect.Scale(element,window.opera?0:1, Object.extend({scaleContent:false, scaleX:false, scaleMode:'box', scaleFrom:100, scaleMode:{originalHeight:elementDimensions.height,originalWidth:elementDimensions.width}, restoreAfterFinish:true, afterSetup:function(effect){ effect.element.makePositioned(); effect.element.down().makePositioned(); if(window.opera)effect.element.setStyle({top:''}); effect.element.makeClipping().show(); }, afterUpdateInternal:function(effect){ effect.element.down().setStyle({bottom: (effect.dims[0]-effect.element.clientHeight)+'px'}); }, afterFinishInternal:function(effect){ effect.element.hide().undoClipping().undoPositioned(); effect.element.down().undoPositioned().setStyle({bottom:oldInnerBottom}); } },arguments[1]||{}) ); }; Effect.Squish=function(element){ return new Effect.Scale(element,window.opera?1:0,{ restoreAfterFinish:true, beforeSetup:function(effect){ effect.element.makeClipping(); }, afterFinishInternal:function(effect){ effect.element.hide().undoClipping(); } }); }; Effect.Grow=function(element){ element=$(element); var options=Object.extend({ direction:'center', moveTransition:Effect.Transitions.sinoidal, scaleTransition:Effect.Transitions.sinoidal, opacityTransition:Effect.Transitions.full },arguments[1]||{}); var oldStyle={ top:element.style.top, left:element.style.left, height:element.style.height, width:element.style.width, opacity:element.getInlineOpacity()}; var dims=element.getDimensions(); var initialMoveX,initialMoveY; var moveX,moveY; switch(options.direction){ case'top-left': initialMoveX=initialMoveY=moveX=moveY=0; break; case'top-right': initialMoveX=dims.width; initialMoveY=moveY=0; moveX=-dims.width; break; case'bottom-left': initialMoveX=moveX=0; initialMoveY=dims.height; moveY=-dims.height; break; case'bottom-right': initialMoveX=dims.width; initialMoveY=dims.height; moveX=-dims.width; moveY=-dims.height; break; case'center': initialMoveX=dims.width/2; initialMoveY=dims.height/2; moveX=-dims.width/2; moveY=-dims.height/2; break; } return new Effect.Move(element,{ x:initialMoveX, y:initialMoveY, duration:0.01, beforeSetup:function(effect){ effect.element.hide().makeClipping().makePositioned(); }, afterFinishInternal:function(effect){ new Effect.Parallel( [new Effect.Opacity(effect.element,{sync:true,to:1.0,from:0.0,transition:options.opacityTransition}), new Effect.Move(effect.element,{x:moveX,y:moveY,sync:true,transition:options.moveTransition}), new Effect.Scale(effect.element,100,{ scaleMode:{originalHeight:dims.height,originalWidth:dims.width}, sync:true,scaleFrom:window.opera?1:0,transition:options.scaleTransition,restoreAfterFinish:true}) ],Object.extend({ beforeSetup:function(effect){ effect.effects[0].element.setStyle({height:'0px'}).show(); }, afterFinishInternal:function(effect){ effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); } },options) ); } }); }; Effect.Shrink=function(element){ element=$(element); var options=Object.extend({ direction:'center', moveTransition:Effect.Transitions.sinoidal, scaleTransition:Effect.Transitions.sinoidal, opacityTransition:Effect.Transitions.none },arguments[1]||{}); var oldStyle={ top:element.style.top, left:element.style.left, height:element.style.height, width:element.style.width, opacity:element.getInlineOpacity()}; var dims=element.getDimensions(); var moveX,moveY; switch(options.direction){ case'top-left': moveX=moveY=0; break; case'top-right': moveX=dims.width; moveY=0; break; case'bottom-left': moveX=0; moveY=dims.height; break; case'bottom-right': moveX=dims.width; moveY=dims.height; break; case'center': moveX=dims.width/2; moveY=dims.height/2; break; } return new Effect.Parallel( [new Effect.Opacity(element,{sync:true,to:0.0,from:1.0,transition:options.opacityTransition}), new Effect.Scale(element,window.opera?1:0,{sync:true,transition:options.scaleTransition,restoreAfterFinish:true}), new Effect.Move(element,{x:moveX,y:moveY,sync:true,transition:options.moveTransition}) ],Object.extend({ beforeStartInternal:function(effect){ effect.effects[0].element.makePositioned().makeClipping(); }, afterFinishInternal:function(effect){ effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle);} },options) ); }; Effect.Pulsate=function(element){ element=$(element); var options=arguments[1]||{}, oldOpacity=element.getInlineOpacity(), transition=options.transition||Effect.Transitions.linear, reverser=function(pos){ return 1-transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2)+.5); }; return new Effect.Opacity(element, Object.extend(Object.extend({duration:2.0,from:0, afterFinishInternal:function(effect){effect.element.setStyle({opacity:oldOpacity});} },options),{transition:reverser})); }; Effect.Fold=function(element){ element=$(element); var oldStyle={ top:element.style.top, left:element.style.left, width:element.style.width, height:element.style.height}; element.makeClipping(); return new Effect.Scale(element,5,Object.extend({ scaleContent:false, scaleX:false, afterFinishInternal:function(effect){ new Effect.Scale(element,1,{ scaleContent:false, scaleY:false, afterFinishInternal:function(effect){ effect.element.hide().undoClipping().setStyle(oldStyle); }}); }},arguments[1]||{})); }; Effect.Morph=Class.create(Effect.Base,{ initialize:function(element){ this.element=$(element); if(!this.element)throw(Effect._elementDoesNotExistError); var options=Object.extend({ style:{} },arguments[1]||{}); if(!Object.isString(options.style))this.style=$H(options.style); else{ if(options.style.include(':')) this.style=options.style.parseStyle(); else{ this.element.addClassName(options.style); this.style=$H(this.element.getStyles()); this.element.removeClassName(options.style); var css=this.element.getStyles(); this.style=this.style.reject(function(style){ return style.value==css[style.key]; }); options.afterFinishInternal=function(effect){ effect.element.addClassName(effect.options.style); effect.transforms.each(function(transform){ effect.element.style[transform.style]=''; }); }; } } this.start(options); }, setup:function(){ function parseColor(color){ if(!color||['rgba(0, 0, 0, 0)','transparent'].include(color))color='#ffffff'; color=color.parseColor(); return $R(0,2).map(function(i){ return parseInt(color.slice(i*2+1,i*2+3),16); }); } this.transforms=this.style.map(function(pair){ var property=pair[0],value=pair[1],unit=null; if(value.parseColor('#zzzzzz')!='#zzzzzz'){ value=value.parseColor(); unit='color'; }else if(property=='opacity'){ value=parseFloat(value); if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout)) this.element.setStyle({zoom:1}); }else if(Element.CSS_LENGTH.test(value)){ var components=value.match(/^([\+\-]?[0-9\.]+)(.*)$/); value=parseFloat(components[1]); unit=(components.length==3)?components[2]:null; } var originalValue=this.element.getStyle(property); return{ style:property.camelize(), originalValue:unit=='color'?parseColor(originalValue):parseFloat(originalValue||0), targetValue:unit=='color'?parseColor(value):value, unit:unit }; }.bind(this)).reject(function(transform){ return( (transform.originalValue==transform.targetValue)|| ( transform.unit!='color'&& (isNaN(transform.originalValue)||isNaN(transform.targetValue)) ) ); }); }, update:function(position){ var style={},transform,i=this.transforms.length; while(i--) style[(transform=this.transforms[i]).style]= transform.unit=='color'?'#'+ (Math.round(transform.originalValue[0]+ (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart()+ (Math.round(transform.originalValue[1]+ (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart()+ (Math.round(transform.originalValue[2]+ (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart(): (transform.originalValue+ (transform.targetValue-transform.originalValue)*position).toFixed(3)+ (transform.unit===null?'':transform.unit); this.element.setStyle(style,true); } }); Effect.Transform=Class.create({ initialize:function(tracks){ this.tracks=[]; this.options=arguments[1]||{}; this.addTracks(tracks); }, addTracks:function(tracks){ tracks.each(function(track){ track=$H(track); var data=track.values().first(); this.tracks.push($H({ ids:track.keys().first(), effect:Effect.Morph, options:{style:data} })); }.bind(this)); return this; }, play:function(){ return new Effect.Parallel( this.tracks.map(function(track){ var ids=track.get('ids'),effect=track.get('effect'),options=track.get('options'); var elements=[$(ids)||$$(ids)].flatten(); return elements.map(function(e){return new effect(e,Object.extend({sync:true},options))}); }).flatten(), this.options ); } }); Element.CSS_PROPERTIES=$w( 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle '+ 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth '+ 'borderRightColor borderRightStyle borderRightWidth borderSpacing '+ 'borderTopColor borderTopStyle borderTopWidth bottom clip color '+ 'fontSize fontWeight height left letterSpacing lineHeight '+ 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+ 'maxWidth minHeight minWidth opacity outlineColor outlineOffset '+ 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop '+ 'right textIndent top width wordSpacing zIndex'); Element.CSS_LENGTH=/^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; String.__parseStyleElement=document.createElement('div'); String.prototype.parseStyle=function(){ var style,styleRules=$H(); if(Prototype.Browser.WebKit) style=new Element('div',{style:this}).style; else{ String.__parseStyleElement.innerHTML='
'; style=String.__parseStyleElement.childNodes[0].style; } Element.CSS_PROPERTIES.each(function(property){ if(style[property])styleRules.set(property,style[property]); }); if(Prototype.Browser.IE&&this.include('opacity')) styleRules.set('opacity',this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]); return styleRules; }; if(document.defaultView&&document.defaultView.getComputedStyle){ Element.getStyles=function(element){ var css=document.defaultView.getComputedStyle($(element),null); return Element.CSS_PROPERTIES.inject({},function(styles,property){ styles[property]=css[property]; return styles; }); }; }else{ Element.getStyles=function(element){ element=$(element); var css=element.currentStyle,styles; styles=Element.CSS_PROPERTIES.inject({},function(results,property){ results[property]=css[property]; return results; }); if(!styles.opacity)styles.opacity=element.getOpacity(); return styles; }; } Effect.Methods={ morph:function(element,style){ element=$(element); new Effect.Morph(element,Object.extend({style:style},arguments[2]||{})); return element; }, visualEffect:function(element,effect,options){ element=$(element); var s=effect.dasherize().camelize(),klass=s.charAt(0).toUpperCase()+s.substring(1); new Effect[klass](element,options); return element; }, highlight:function(element,options){ element=$(element); new Effect.Highlight(element,options); return element; } }; $w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+ 'pulsate shake puff squish switchOff dropOut').each( function(effect){ Effect.Methods[effect]=function(element,options){ element=$(element); Effect[effect.charAt(0).toUpperCase()+effect.substring(1)](element,options); return element; }; } ); $w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( function(f){Effect.Methods[f]=Element[f];} ); Element.addMethods(Effect.Methods); if(Object.isUndefined(Effect)) throw("dragdrop.js requires including script.aculo.us' effects.js library"); var Droppables={ drops:[], remove:function(element){ this.drops=this.drops.reject(function(d){return d.element==$(element)}); }, add:function(element){ element=$(element); var options=Object.extend({ greedy:true, hoverclass:null, tree:false },arguments[1]||{}); if(options.containment){ options._containers=[]; var containment=options.containment; if(Object.isArray(containment)){ containment.each(function(c){options._containers.push($(c))}); }else{ options._containers.push($(containment)); } } if(options.accept)options.accept=[options.accept].flatten(); Element.makePositioned(element); options.element=element; this.drops.push(options); }, findDeepestChild:function(drops){ deepest=drops[0]; for(i=1;i0) drop=Droppables.findDeepestChild(affected); if(this.last_active&&this.last_active!=drop)this.deactivate(this.last_active); if(drop){ Position.within(drop.element,point[0],point[1]); if(drop.onHover) drop.onHover(element,drop.element,Position.overlap(drop.overlap,drop.element)); if(drop!=this.last_active)Droppables.activate(drop); } }, fire:function(event,element){ if(!this.last_active)return; Position.prepare(); if(this.isAffected([Event.pointerX(event),Event.pointerY(event)],element,this.last_active)) if(this.last_active.onDrop){ this.last_active.onDrop(element,this.last_active.element,event); return true; } }, reset:function(){ if(this.last_active) this.deactivate(this.last_active); } }; var Draggables={ drags:[], observers:[], register:function(draggable){ if(this.drags.length==0){ this.eventMouseUp=this.endDrag.bindAsEventListener(this); this.eventMouseMove=this.updateDrag.bindAsEventListener(this); this.eventKeypress=this.keyPress.bindAsEventListener(this); Event.observe(document,"mouseup",this.eventMouseUp); Event.observe(draggable.element,"mousemove",this.eventMouseMove); Event.observe(document,"keypress",this.eventKeypress); } this.drags.push(draggable); }, unregister:function(draggable){ this.drags=this.drags.reject(function(d){return d==draggable}); if(this.drags.length==0){ Event.stopObserving(document,"mouseup",this.eventMouseUp); Event.stopObserving(draggable.element,"mousemove",this.eventMouseMove); Event.stopObserving(document,"keypress",this.eventKeypress); } }, activate:function(draggable){ if(draggable.options.delay){ this._timeout=setTimeout(function(){ Draggables._timeout=null; window.focus(); Draggables.activeDraggable=draggable; }.bind(this),draggable.options.delay); }else{ window.focus(); this.activeDraggable=draggable; } }, deactivate:function(){ this.activeDraggable=null; }, updateDrag:function(event){ if(!this.activeDraggable)return; var pointer=[Event.pointerX(event),Event.pointerY(event)]; if(this._lastPointer&&(this._lastPointer.inspect()==pointer.inspect()))return; this._lastPointer=pointer; this.activeDraggable.updateDrag(event,pointer); }, endDrag:function(event){ if(this._timeout){ clearTimeout(this._timeout); this._timeout=null; } if(!this.activeDraggable)return; this._lastPointer=null; this.activeDraggable.endDrag(event); this.activeDraggable=null; }, keyPress:function(event){ if(this.activeDraggable) this.activeDraggable.keyPress(event); }, addObserver:function(observer){ this.observers.push(observer); this._cacheObserverCallbacks(); }, removeObserver:function(element){ this.observers=this.observers.reject(function(o){return o.element==element}); this._cacheObserverCallbacks(); }, notify:function(eventName,draggable,event){ if(this[eventName+'Count']>0) this.observers.each(function(o){ if(o[eventName])o[eventName](eventName,draggable,event); }); if(draggable.options[eventName])draggable.options[eventName](draggable,event); }, _cacheObserverCallbacks:function(){ ['onStart','onEnd','onDrag'].each(function(eventName){ Draggables[eventName+'Count']=Draggables.observers.select( function(o){return o[eventName];} ).length; }); } }; var Draggable=Class.create({ initialize:function(element){ var defaults={ handle:false, reverteffect:function(element,top_offset,left_offset){ var dur=Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; new Effect.Move(element,{x:-left_offset,y:-top_offset,duration:dur, queue:{scope:'_draggable',position:'end'} }); }, endeffect:function(element){ var toOpacity=Object.isNumber(element._opacity)?element._opacity:1.0; new Effect.Opacity(element,{duration:0.2,from:0.7,to:toOpacity, queue:{scope:'_draggable',position:'end'}, afterFinish:function(){ Draggable._dragging[element]=false } }); }, zindex:1000, revert:false, quiet:false, scroll:false, scrollSensitivity:20, scrollSpeed:15, snap:false, delay:0 }; if(!arguments[1]||Object.isUndefined(arguments[1].endeffect)) Object.extend(defaults,{ starteffect:function(element){ element._opacity=Element.getOpacity(element); Draggable._dragging[element]=true; new Effect.Opacity(element,{duration:0.2,from:element._opacity,to:0.7}); } }); var options=Object.extend(defaults,arguments[1]||{}); this.element=$(element); if(options.handle&&Object.isString(options.handle)) this.handle=this.element.down('.'+options.handle,0); if(!this.handle)this.handle=$(options.handle); if(!this.handle)this.handle=this.element; if(options.scroll&&!options.scroll.scrollTo&&!options.scroll.outerHTML){ options.scroll=$(options.scroll); this._isScrollChild=Element.childOf(this.element,options.scroll); } Element.makePositioned(this.element); this.options=options; this.dragging=false; this.eventMouseDown=this.initDrag.bindAsEventListener(this); Event.observe(this.handle,"mousedown",this.eventMouseDown); Draggables.register(this); }, destroy:function(){ Event.stopObserving(this.handle,"mousedown",this.eventMouseDown); Draggables.unregister(this); }, currentDelta:function(){ return([ parseInt(Element.getStyle(this.element,'left')||'0'), parseInt(Element.getStyle(this.element,'top')||'0')]); }, initDrag:function(event){ if(!Object.isUndefined(Draggable._dragging[this.element])&& Draggable._dragging[this.element])return; if(Event.isLeftClick(event)){ var src=Event.element(event); if((tag_name=src.tagName.toUpperCase())&&( tag_name=='INPUT'|| tag_name=='SELECT'|| tag_name=='OPTION'|| tag_name=='BUTTON'|| tag_name=='TEXTAREA'))return; var pointer=[Event.pointerX(event),Event.pointerY(event)]; var pos=Position.cumulativeOffset(this.element); this.offset=[0,1].map(function(i){return(pointer[i]-pos[i])}); Draggables.activate(this); Event.stop(event); } }, startDrag:function(event){ this.dragging=true; if(!this.delta) this.delta=this.currentDelta(); if(this.options.zindex){ this.originalZ=parseInt(Element.getStyle(this.element,'z-index')||0); this.element.style.zIndex=this.options.zindex; } if(this.options.ghosting){ this._clone=this.element.cloneNode(true); this._originallyAbsolute=(this.element.getStyle('position')=='absolute'); if(!this._originallyAbsolute) Position.absolutize(this.element); this.element.parentNode.insertBefore(this._clone,this.element); } if(this.options.scroll){ if(this.options.scroll==window){ var where=this._getWindowScroll(this.options.scroll); this.originalScrollLeft=where.left; this.originalScrollTop=where.top; }else{ this.originalScrollLeft=this.options.scroll.scrollLeft; this.originalScrollTop=this.options.scroll.scrollTop; } } Draggables.notify('onStart',this,event); if(this.options.starteffect)this.options.starteffect(this.element); }, updateDrag:function(event,pointer){ if(!this.dragging)this.startDrag(event); if(!this.options.quiet){ Position.prepare(); Droppables.show(pointer,this.element); } Draggables.notify('onDrag',this,event); this.draw(pointer); if(this.options.change)this.options.change(this); if(this.options.scroll){ this.stopScrolling(); var p; if(this.options.scroll==window){ with(this._getWindowScroll(this.options.scroll)){p=[left,top,left+width,top+height];} }else{ p=Position.page(this.options.scroll); p[0]+=this.options.scroll.scrollLeft+Position.deltaX; p[1]+=this.options.scroll.scrollTop+Position.deltaY; p.push(p[0]+this.options.scroll.offsetWidth); p.push(p[1]+this.options.scroll.offsetHeight); } var speed=[0,0]; if(pointer[0]<(p[0]+this.options.scrollSensitivity))speed[0]=pointer[0]-(p[0]+this.options.scrollSensitivity); if(pointer[1]<(p[1]+this.options.scrollSensitivity))speed[1]=pointer[1]-(p[1]+this.options.scrollSensitivity); if(pointer[0]>(p[2]-this.options.scrollSensitivity))speed[0]=pointer[0]-(p[2]-this.options.scrollSensitivity); if(pointer[1]>(p[3]-this.options.scrollSensitivity))speed[1]=pointer[1]-(p[3]-this.options.scrollSensitivity); this.startScrolling(speed); } if(Prototype.Browser.WebKit)window.scrollBy(0,0); Event.stop(event); }, finishDrag:function(event,success){ this.dragging=false; if(this.options.quiet){ Position.prepare(); var pointer=[Event.pointerX(event),Event.pointerY(event)]; Droppables.show(pointer,this.element); } if(this.options.ghosting){ if(!this._originallyAbsolute) Position.relativize(this.element); delete this._originallyAbsolute; Element.remove(this._clone); this._clone=null; } var dropped=false; if(success){ dropped=Droppables.fire(event,this.element); if(!dropped)dropped=false; } if(dropped&&this.options.onDropped)this.options.onDropped(this.element); Draggables.notify('onEnd',this,event); var revert=this.options.revert; if(revert&&Object.isFunction(revert))revert=revert(this.element); var d=this.currentDelta(); if(revert&&this.options.reverteffect){ if(dropped==0||revert!='failure') this.options.reverteffect(this.element, d[1]-this.delta[1],d[0]-this.delta[0]); }else{ this.delta=d; } if(this.options.zindex) this.element.style.zIndex=this.originalZ; if(this.options.endeffect) this.options.endeffect(this.element); Draggables.deactivate(this); Droppables.reset(); }, keyPress:function(event){ if(event.keyCode!=Event.KEY_ESC)return; this.finishDrag(event,false); Event.stop(event); }, endDrag:function(event){ if(!this.dragging)return; this.stopScrolling(); this.finishDrag(event,true); Event.stop(event); }, draw:function(point){ var pos=Position.cumulativeOffset(this.element); if(this.options.ghosting){ var r=Position.realOffset(this.element); pos[0]+=r[0]-Position.deltaX;pos[1]+=r[1]-Position.deltaY; } var d=this.currentDelta(); pos[0]-=d[0];pos[1]-=d[1]; if(this.options.scroll&&(this.options.scroll!=window&&this._isScrollChild)){ pos[0]-=this.options.scroll.scrollLeft-this.originalScrollLeft; pos[1]-=this.options.scroll.scrollTop-this.originalScrollTop; } var p=[0,1].map(function(i){ return(point[i]-pos[i]-this.offset[i]) }.bind(this)); if(this.options.snap){ if(Object.isFunction(this.options.snap)){ p=this.options.snap(p[0],p[1],this); }else{ if(Object.isArray(this.options.snap)){ p=p.map(function(v,i){ return(v/this.options.snap[i]).round()*this.options.snap[i]}.bind(this)); }else{ p=p.map(function(v){ return(v/this.options.snap).round()*this.options.snap}.bind(this)); } }} var style=this.element.style; if((!this.options.constraint)||(this.options.constraint=='horizontal')) style.left=p[0]+"px"; if((!this.options.constraint)||(this.options.constraint=='vertical')) style.top=p[1]+"px"; if(style.visibility=="hidden")style.visibility=""; }, stopScrolling:function(){ if(this.scrollInterval){ clearInterval(this.scrollInterval); this.scrollInterval=null; Draggables._lastScrollPointer=null; } }, startScrolling:function(speed){ if(!(speed[0]||speed[1]))return; this.scrollSpeed=[speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed]; this.lastScrolled=new Date(); this.scrollInterval=setInterval(this.scroll.bind(this),10); }, scroll:function(){ var current=new Date(); var delta=current-this.lastScrolled; this.lastScrolled=current; if(this.options.scroll==window){ with(this._getWindowScroll(this.options.scroll)){ if(this.scrollSpeed[0]||this.scrollSpeed[1]){ var d=delta/1000; this.options.scroll.scrollTo(left+d*this.scrollSpeed[0],top+d*this.scrollSpeed[1]); } } }else{ this.options.scroll.scrollLeft+=this.scrollSpeed[0]*delta/1000; this.options.scroll.scrollTop+=this.scrollSpeed[1]*delta/1000; } Position.prepare(); Droppables.show(Draggables._lastPointer,this.element); Draggables.notify('onDrag',this); if(this._isScrollChild){ Draggables._lastScrollPointer=Draggables._lastScrollPointer||$A(Draggables._lastPointer); Draggables._lastScrollPointer[0]+=this.scrollSpeed[0]*delta/1000; Draggables._lastScrollPointer[1]+=this.scrollSpeed[1]*delta/1000; if(Draggables._lastScrollPointer[0]<0) Draggables._lastScrollPointer[0]=0; if(Draggables._lastScrollPointer[1]<0) Draggables._lastScrollPointer[1]=0; this.draw(Draggables._lastScrollPointer); } if(this.options.change)this.options.change(this); }, _getWindowScroll:function(w){ var T,L,W,H; with(w.document){ if(w.document.documentElement&&documentElement.scrollTop){ T=documentElement.scrollTop; L=documentElement.scrollLeft; }else if(w.document.body){ T=body.scrollTop; L=body.scrollLeft; } if(w.innerWidth){ W=w.innerWidth; H=w.innerHeight; }else if(w.document.documentElement&&documentElement.clientWidth){ W=documentElement.clientWidth; H=documentElement.clientHeight; }else{ W=body.offsetWidth; H=body.offsetHeight; } } return{top:T,left:L,width:W,height:H}; } }); Draggable._dragging={}; var SortableObserver=Class.create({ initialize:function(element,observer){ this.element=$(element); this.observer=observer; this.lastValue=Sortable.serialize(this.element); }, onStart:function(){ this.lastValue=Sortable.serialize(this.element); }, onEnd:function(){ Sortable.unmark(); if(this.lastValue!=Sortable.serialize(this.element)) this.observer(this.element) } }); var Sortable={ SERIALIZE_RULE:/^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, sortables:{}, _findRootElement:function(element){ while(element.tagName.toUpperCase()!="BODY"){ if(element.id&&Sortable.sortables[element.id])return element; element=element.parentNode; } }, options:function(element){ element=Sortable._findRootElement($(element)); if(!element)return; return Sortable.sortables[element.id]; }, destroy:function(element){ element=$(element); var s=Sortable.sortables[element.id]; if(s){ Draggables.removeObserver(s.element); s.droppables.each(function(d){Droppables.remove(d)}); s.draggables.invoke('destroy'); delete Sortable.sortables[s.element.id]; } }, create:function(element){ element=$(element); var options=Object.extend({ element:element, tag:'li', dropOnEmpty:false, tree:false, treeTag:'ul', overlap:'vertical', constraint:'vertical', containment:element, handle:false, only:false, delay:0, hoverclass:null, ghosting:false, quiet:false, scroll:false, scrollSensitivity:20, scrollSpeed:15, format:this.SERIALIZE_RULE, elements:false, handles:false, onChange:Prototype.emptyFunction, onUpdate:Prototype.emptyFunction },arguments[1]||{}); this.destroy(element); var options_for_draggable={ revert:true, quiet:options.quiet, scroll:options.scroll, scrollSpeed:options.scrollSpeed, scrollSensitivity:options.scrollSensitivity, delay:options.delay, ghosting:options.ghosting, constraint:options.constraint, handle:options.handle}; if(options.starteffect) options_for_draggable.starteffect=options.starteffect; if(options.reverteffect) options_for_draggable.reverteffect=options.reverteffect; else if(options.ghosting)options_for_draggable.reverteffect=function(element){ element.style.top=0; element.style.left=0; }; if(options.endeffect) options_for_draggable.endeffect=options.endeffect; if(options.zindex) options_for_draggable.zindex=options.zindex; var options_for_droppable={ overlap:options.overlap, containment:options.containment, tree:options.tree, hoverclass:options.hoverclass, onHover:Sortable.onHover }; var options_for_tree={ onHover:Sortable.onEmptyHover, overlap:options.overlap, containment:options.containment, hoverclass:options.hoverclass }; Element.cleanWhitespace(element); options.draggables=[]; options.droppables=[]; if(options.dropOnEmpty||options.tree){ Droppables.add(element,options_for_tree); options.droppables.push(element); } (options.elements||this.findElements(element,options)||[]).each(function(e,i){ var handle=options.handles?$(options.handles[i]): (options.handle?$(e).select('.'+options.handle)[0]:e); options.draggables.push( new Draggable(e,Object.extend(options_for_draggable,{handle:handle}))); Droppables.add(e,options_for_droppable); if(options.tree)e.treeNode=element; options.droppables.push(e); }); if(options.tree){ (Sortable.findTreeElements(element,options)||[]).each(function(e){ Droppables.add(e,options_for_tree); e.treeNode=element; options.droppables.push(e); }); } this.sortables[element.id]=options; Draggables.addObserver(new SortableObserver(element,options.onUpdate)); }, findElements:function(element,options){ return Element.findChildren( element,options.only,options.tree?true:false,options.tag); }, findTreeElements:function(element,options){ return Element.findChildren( element,options.only,options.tree?true:false,options.treeTag); }, onHover:function(element,dropon,overlap){ if(Element.isParent(dropon,element))return; if(overlap>.33&&overlap<.66&&Sortable.options(dropon).tree){ return; }else if(overlap>0.5){ Sortable.mark(dropon,'before'); if(dropon.previousSibling!=element){ var oldParentNode=element.parentNode; element.style.visibility="hidden"; dropon.parentNode.insertBefore(element,dropon); if(dropon.parentNode!=oldParentNode) Sortable.options(oldParentNode).onChange(element); Sortable.options(dropon.parentNode).onChange(element); } }else{ Sortable.mark(dropon,'after'); var nextElement=dropon.nextSibling||null; if(nextElement!=element){ var oldParentNode=element.parentNode; element.style.visibility="hidden"; dropon.parentNode.insertBefore(element,nextElement); if(dropon.parentNode!=oldParentNode) Sortable.options(oldParentNode).onChange(element); Sortable.options(dropon.parentNode).onChange(element); } } }, onEmptyHover:function(element,dropon,overlap){ var oldParentNode=element.parentNode; var droponOptions=Sortable.options(dropon); if(!Element.isParent(dropon,element)){ var index; var children=Sortable.findElements(dropon,{tag:droponOptions.tag,only:droponOptions.only}); var child=null; if(children){ var offset=Element.offsetSize(dropon,droponOptions.overlap)*(1.0-overlap); for(index=0;index=0){ offset-=Element.offsetSize(children[index],droponOptions.overlap); }else if(offset-(Element.offsetSize(children[index],droponOptions.overlap)/2)>=0){ child=index+1'); this.iefix=$(this.update.id+'_iefix'); } if(this.iefix)setTimeout(this.fixIEOverlapping.bind(this),50); }, fixIEOverlapping:function(){ Position.clone(this.update,this.iefix,{setTop:(!this.update.style.height)}); this.iefix.style.zIndex=1; this.update.style.zIndex=2; Element.show(this.iefix); }, hide:function(){ this.stopIndicator(); if(Element.getStyle(this.update,'display')!='none')this.options.onHide(this.element,this.update); if(this.iefix)Element.hide(this.iefix); }, startIndicator:function(){ if(this.options.indicator)Element.show(this.options.indicator); }, stopIndicator:function(){ if(this.options.indicator)Element.hide(this.options.indicator); }, onKeyPress:function(event){ if(this.active) switch(event.keyCode){ case Event.KEY_TAB: case Event.KEY_RETURN: this.selectEntry(); Event.stop(event); case Event.KEY_ESC: this.hide(); this.active=false; Event.stop(event); return; case Event.KEY_LEFT: case Event.KEY_RIGHT: return; case Event.KEY_UP: this.markPrevious(); this.render(); Event.stop(event); return; case Event.KEY_DOWN: this.markNext(); this.render(); Event.stop(event); return; } else if(event.keyCode==Event.KEY_TAB||event.keyCode==Event.KEY_RETURN|| (Prototype.Browser.WebKit>0&&event.keyCode==0))return; this.changed=true; this.hasFocus=true; if(this.observer)clearTimeout(this.observer); this.observer= setTimeout(this.onObserverEvent.bind(this),this.options.frequency*1000); }, activate:function(){ this.changed=false; this.hasFocus=true; this.getUpdatedChoices(); }, onHover:function(event){ var element=Event.findElement(event,'LI'); if(this.index!=element.autocompleteIndex) { this.index=element.autocompleteIndex; this.render(); } Event.stop(event); }, onClick:function(event){ var element=Event.findElement(event,'LI'); this.index=element.autocompleteIndex; this.selectEntry(); this.hide(); }, onBlur:function(event){ setTimeout(this.hide.bind(this),250); this.hasFocus=false; this.active=false; }, render:function(){ if(this.entryCount>0){ for(var i=0;i0)this.index--; else this.index=this.entryCount-1; }, markNext:function(){ if(this.index0)value=Element.collectTextNodes(nodes[0],this.options.select); }else value=Element.collectTextNodesIgnoreClass(selectedElement,'informal'); var bounds=this.getTokenBounds(); if(bounds[0]!=-1){ var newValue=this.element.value.substr(0,bounds[0]); var whitespace=this.element.value.substr(bounds[0]).match(/^\s+/); if(whitespace) newValue+=whitespace[0]; this.element.value=newValue+value+this.element.value.substr(bounds[1]); }else{ this.element.value=value; } this.oldElementValue=this.element.value; this.element.focus(); if(this.options.afterUpdateElement) this.options.afterUpdateElement(this.element,selectedElement); }, updateChoices:function(choices){ if(!this.changed&&this.hasFocus){ this.update.innerHTML=choices; Element.cleanWhitespace(this.update); Element.cleanWhitespace(this.update.down()); if(this.update.firstChild&&this.update.down().childNodes){ this.entryCount= this.update.down().childNodes.length; for(var i=0;i=this.options.minChars){ this.getUpdatedChoices(); }else{ this.active=false; this.hide(); } this.oldElementValue=this.element.value; }, getToken:function(){ var bounds=this.getTokenBounds(); return this.element.value.substring(bounds[0],bounds[1]).strip(); }, getTokenBounds:function(){ if(null!=this.tokenBounds)return this.tokenBounds; var value=this.element.value; if(value.strip().empty())return[-1,0]; var diff=arguments.callee.getFirstDifferencePos(value,this.oldElementValue); var offset=(diff==this.oldElementValue.length?1:0); var prevTokenPos=-1,nextTokenPos=value.length; var tp; for(var index=0,l=this.options.tokens.length;indexprevTokenPos)prevTokenPos=tp; tp=value.indexOf(this.options.tokens[index],diff+offset); if(-1!=tp&&tp"+elem.substr(0,entry.length)+""+ elem.substr(entry.length)+""); break; }else if(entry.length>=instance.options.partialChars&& instance.options.partialSearch&&foundPos!=-1){ if(instance.options.fullSearch||/\s/.test(elem.substr(foundPos-1,1))){ partial.push("
  • "+elem.substr(0,foundPos)+""+ elem.substr(foundPos,entry.length)+""+elem.substr( foundPos+entry.length)+"
  • "); break; } } foundPos=instance.options.ignoreCase? elem.toLowerCase().indexOf(entry.toLowerCase(),foundPos+1): elem.indexOf(entry,foundPos+1); } } if(partial.length) ret=ret.concat(partial.slice(0,instance.options.choices-ret.length)); return"
      "+ret.join('')+"
    "; } },options||{}); } }); Field.scrollFreeActivate=function(field){ setTimeout(function(){ Field.activate(field); },1); }; Ajax.InPlaceEditor=Class.create({ initialize:function(element,url,options){ this.url=url; this.element=element=$(element); this.prepareOptions(); this._controls={}; arguments.callee.dealWithDeprecatedOptions(options); Object.extend(this.options,options||{}); if(!this.options.formId&&this.element.id){ this.options.formId=this.element.id+'-inplaceeditor'; if($(this.options.formId)) this.options.formId=''; } if(this.options.externalControl) this.options.externalControl=$(this.options.externalControl); if(!this.options.externalControl) this.options.externalControlOnly=false; this._originalBackground=this.element.getStyle('background-color')||'transparent'; this.element.title=this.options.clickToEditText; this._boundCancelHandler=this.handleFormCancellation.bind(this); this._boundComplete=(this.options.onComplete||Prototype.emptyFunction).bind(this); this._boundFailureHandler=this.handleAJAXFailure.bind(this); this._boundSubmitHandler=this.handleFormSubmission.bind(this); this._boundWrapperHandler=this.wrapUp.bind(this); this.registerListeners(); }, checkForEscapeOrReturn:function(e){ if(!this._editing||e.ctrlKey||e.altKey||e.shiftKey)return; if(Event.KEY_ESC==e.keyCode) this.handleFormCancellation(e); else if(Event.KEY_RETURN==e.keyCode) this.handleFormSubmission(e); }, createControl:function(mode,handler,extraClasses){ var control=this.options[mode+'Control']; var text=this.options[mode+'Text']; if('button'==control){ var btn=document.createElement('input'); btn.type='submit'; btn.value=text; btn.className='editor_'+mode+'_button'; if('cancel'==mode) btn.onclick=this._boundCancelHandler; this._form.appendChild(btn); this._controls[mode]=btn; }else if('link'==control){ var link=document.createElement('a'); link.href='#'; link.appendChild(document.createTextNode(text)); link.onclick='cancel'==mode?this._boundCancelHandler:this._boundSubmitHandler; link.className='editor_'+mode+'_link'; if(extraClasses) link.className+=' '+extraClasses; this._form.appendChild(link); this._controls[mode]=link; } }, createEditField:function(){ var text=(this.options.loadTextURL?this.options.loadingText:this.getText()); var fld; if(1>=this.options.rows&&!/\r|\n/.test(this.getText())){ fld=document.createElement('input'); fld.type='text'; var size=this.options.size||this.options.cols||0; if(0=this.options.rows?this.options.autoRows:this.options.rows); fld.cols=this.options.cols||40; } fld.name=this.options.paramName; fld.value=text; fld.className='editor_field'; if(this.options.submitOnBlur) fld.onblur=this._boundSubmitHandler; this._controls.editor=fld; if(this.options.loadTextURL) this.loadExternalText(); this._form.appendChild(this._controls.editor); }, createForm:function(){ var ipe=this; function addText(mode,condition){ var text=ipe.options['text'+mode+'Controls']; if(!text||condition===false)return; ipe._form.appendChild(document.createTextNode(text)); }; this._form=$(document.createElement('form')); this._form.id=this.options.formId; this._form.addClassName(this.options.formClassName); this._form.onsubmit=this._boundSubmitHandler; this.createEditField(); if('textarea'==this._controls.editor.tagName.toLowerCase()) this._form.appendChild(document.createElement('br')); if(this.options.onFormCustomization) this.options.onFormCustomization(this,this._form); addText('Before',this.options.okControl||this.options.cancelControl); this.createControl('ok',this._boundSubmitHandler); addText('Between',this.options.okControl&&this.options.cancelControl); this.createControl('cancel',this._boundCancelHandler,'editor_cancel'); addText('After',this.options.okControl||this.options.cancelControl); }, destroy:function(){ if(this._oldInnerHTML) this.element.innerHTML=this._oldInnerHTML; this.leaveEditMode(); this.unregisterListeners(); }, enterEditMode:function(e){ if(this._saving||this._editing)return; this._editing=true; this.triggerCallback('onEnterEditMode'); if(this.options.externalControl) this.options.externalControl.hide(); this.element.hide(); this.createForm(); this.element.parentNode.insertBefore(this._form,this.element); if(!this.options.loadTextURL) this.postProcessEditField(); if(e)Event.stop(e); }, enterHover:function(e){ if(this.options.hoverClassName) this.element.addClassName(this.options.hoverClassName); if(this._saving)return; this.triggerCallback('onEnterHover'); }, getText:function(){ return this.element.innerHTML.unescapeHTML(); }, handleAJAXFailure:function(transport){ this.triggerCallback('onFailure',transport); if(this._oldInnerHTML){ this.element.innerHTML=this._oldInnerHTML; this._oldInnerHTML=null; } }, handleFormCancellation:function(e){ this.wrapUp(); if(e)Event.stop(e); }, handleFormSubmission:function(e){ var form=this._form; var value=$F(this._controls.editor); this.prepareSubmission(); var params=this.options.callback(form,value)||''; if(Object.isString(params)) params=params.toQueryParams(); params.editorId=this.element.id; if(this.options.htmlResponse){ var options=Object.extend({evalScripts:true},this.options.ajaxOptions); Object.extend(options,{ parameters:params, onComplete:this._boundWrapperHandler, onFailure:this._boundFailureHandler }); new Ajax.Updater({success:this.element},this.url,options); }else{ var options=Object.extend({method:'get'},this.options.ajaxOptions); Object.extend(options,{ parameters:params, onComplete:this._boundWrapperHandler, onFailure:this._boundFailureHandler }); new Ajax.Request(this.url,options); } if(e)Event.stop(e); }, leaveEditMode:function(){ this.element.removeClassName(this.options.savingClassName); this.removeForm(); this.leaveHover(); this.element.style.backgroundColor=this._originalBackground; this.element.show(); if(this.options.externalControl) this.options.externalControl.show(); this._saving=false; this._editing=false; this._oldInnerHTML=null; this.triggerCallback('onLeaveEditMode'); }, leaveHover:function(e){ if(this.options.hoverClassName) this.element.removeClassName(this.options.hoverClassName); if(this._saving)return; this.triggerCallback('onLeaveHover'); }, loadExternalText:function(){ this._form.addClassName(this.options.loadingClassName); this._controls.editor.disabled=true; var options=Object.extend({method:'get'},this.options.ajaxOptions); Object.extend(options,{ parameters:'editorId='+encodeURIComponent(this.element.id), onComplete:Prototype.emptyFunction, onSuccess:function(transport){ this._form.removeClassName(this.options.loadingClassName); var text=transport.responseText; if(this.options.stripLoadedTextTags) text=text.stripTags(); this._controls.editor.value=text; this._controls.editor.disabled=false; this.postProcessEditField(); }.bind(this), onFailure:this._boundFailureHandler }); new Ajax.Request(this.options.loadTextURL,options); }, postProcessEditField:function(){ var fpc=this.options.fieldPostCreation; if(fpc) $(this._controls.editor)['focus'==fpc?'focus':'activate'](); }, prepareOptions:function(){ this.options=Object.clone(Ajax.InPlaceEditor.DefaultOptions); Object.extend(this.options,Ajax.InPlaceEditor.DefaultCallbacks); [this._extraDefaultOptions].flatten().compact().each(function(defs){ Object.extend(this.options,defs); }.bind(this)); }, prepareSubmission:function(){ this._saving=true; this.removeForm(); this.leaveHover(); this.showSaving(); }, registerListeners:function(){ this._listeners={}; var listener; $H(Ajax.InPlaceEditor.Listeners).each(function(pair){ listener=this[pair.value].bind(this); this._listeners[pair.key]=listener; if(!this.options.externalControlOnly) this.element.observe(pair.key,listener); if(this.options.externalControl) this.options.externalControl.observe(pair.key,listener); }.bind(this)); }, removeForm:function(){ if(!this._form)return; this._form.remove(); this._form=null; this._controls={}; }, showSaving:function(){ this._oldInnerHTML=this.element.innerHTML; this.element.innerHTML=this.options.savingText; this.element.addClassName(this.options.savingClassName); this.element.style.backgroundColor=this._originalBackground; this.element.show(); }, triggerCallback:function(cbName,arg){ if('function'==typeof this.options[cbName]){ this.options[cbName](this,arg); } }, unregisterListeners:function(){ $H(this._listeners).each(function(pair){ if(!this.options.externalControlOnly) this.element.stopObserving(pair.key,pair.value); if(this.options.externalControl) this.options.externalControl.stopObserving(pair.key,pair.value); }.bind(this)); }, wrapUp:function(transport){ this.leaveEditMode(); this._boundComplete(transport,this.element); } }); Object.extend(Ajax.InPlaceEditor.prototype,{ dispose:Ajax.InPlaceEditor.prototype.destroy }); Ajax.InPlaceCollectionEditor=Class.create(Ajax.InPlaceEditor,{ initialize:function($super,element,url,options){ this._extraDefaultOptions=Ajax.InPlaceCollectionEditor.DefaultOptions; $super(element,url,options); }, createEditField:function(){ var list=document.createElement('select'); list.name=this.options.paramName; list.size=1; this._controls.editor=list; this._collection=this.options.collection||[]; if(this.options.loadCollectionURL) this.loadCollection(); else this.checkForExternalText(); this._form.appendChild(this._controls.editor); }, loadCollection:function(){ this._form.addClassName(this.options.loadingClassName); this.showLoadingText(this.options.loadingCollectionText); var options=Object.extend({method:'get'},this.options.ajaxOptions); Object.extend(options,{ parameters:'editorId='+encodeURIComponent(this.element.id), onComplete:Prototype.emptyFunction, onSuccess:function(transport){ var js=transport.responseText.strip(); if(!/^\[.*\]$/.test(js)) throw('Server returned an invalid collection representation.'); this._collection=eval(js); this.checkForExternalText(); }.bind(this), onFailure:this.onFailure }); new Ajax.Request(this.options.loadCollectionURL,options); }, showLoadingText:function(text){ this._controls.editor.disabled=true; var tempOption=this._controls.editor.firstChild; if(!tempOption){ tempOption=document.createElement('option'); tempOption.value=''; this._controls.editor.appendChild(tempOption); tempOption.selected=true; } tempOption.update((text||'').stripScripts().stripTags()); }, checkForExternalText:function(){ this._text=this.getText(); if(this.options.loadTextURL) this.loadExternalText(); else this.buildOptionList(); }, loadExternalText:function(){ this.showLoadingText(this.options.loadingText); var options=Object.extend({method:'get'},this.options.ajaxOptions); Object.extend(options,{ parameters:'editorId='+encodeURIComponent(this.element.id), onComplete:Prototype.emptyFunction, onSuccess:function(transport){ this._text=transport.responseText.strip(); this.buildOptionList(); }.bind(this), onFailure:this.onFailure }); new Ajax.Request(this.options.loadTextURL,options); }, buildOptionList:function(){ this._form.removeClassName(this.options.loadingClassName); this._collection=this._collection.map(function(entry){ return 2===entry.length?entry:[entry,entry].flatten(); }); var marker=('value'in this.options)?this.options.value:this._text; var textFound=this._collection.any(function(entry){ return entry[0]==marker; }.bind(this)); this._controls.editor.update(''); var option; this._collection.each(function(entry,index){ option=document.createElement('option'); option.value=entry[0]; option.selected=textFound?entry[0]==marker:0==index; option.appendChild(document.createTextNode(entry[1])); this._controls.editor.appendChild(option); }.bind(this)); this._controls.editor.disabled=false; Field.scrollFreeActivate(this._controls.editor); } }); Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions=function(options){ if(!options)return; function fallback(name,expr){ if(name in options||expr===undefined)return; options[name]=expr; }; fallback('cancelControl',(options.cancelLink?'link':(options.cancelButton?'button': options.cancelLink==options.cancelButton==false?false:undefined))); fallback('okControl',(options.okLink?'link':(options.okButton?'button': options.okLink==options.okButton==false?false:undefined))); fallback('highlightColor',options.highlightcolor); fallback('highlightEndColor',options.highlightendcolor); }; Object.extend(Ajax.InPlaceEditor,{ DefaultOptions:{ ajaxOptions:{}, autoRows:3, cancelControl:'link', cancelText:'cancel', clickToEditText:'Click to edit', externalControl:null, externalControlOnly:false, fieldPostCreation:'activate', formClassName:'inplaceeditor-form', formId:null, highlightColor:'#ffff99', highlightEndColor:'#ffffff', hoverClassName:'', htmlResponse:true, loadingClassName:'inplaceeditor-loading', loadingText:'Loading...', okControl:'button', okText:'ok', paramName:'value', rows:1, savingClassName:'inplaceeditor-saving', savingText:'Saving...', size:0, stripLoadedTextTags:false, submitOnBlur:false, textAfterControls:'', textBeforeControls:'', textBetweenControls:'' }, DefaultCallbacks:{ callback:function(form){ return Form.serialize(form); }, onComplete:function(transport,element){ new Effect.Highlight(element,{ startcolor:this.options.highlightColor,keepBackgroundImage:true}); }, onEnterEditMode:null, onEnterHover:function(ipe){ ipe.element.style.backgroundColor=ipe.options.highlightColor; if(ipe._effect) ipe._effect.cancel(); }, onFailure:function(transport,ipe){ alert('Error communication with the server: '+transport.responseText.stripTags()); }, onFormCustomization:null, onLeaveEditMode:null, onLeaveHover:function(ipe){ ipe._effect=new Effect.Highlight(ipe.element,{ startcolor:ipe.options.highlightColor,endcolor:ipe.options.highlightEndColor, restorecolor:ipe._originalBackground,keepBackgroundImage:true }); } }, Listeners:{ click:'enterEditMode', keydown:'checkForEscapeOrReturn', mouseover:'enterHover', mouseout:'leaveHover' } }); Ajax.InPlaceCollectionEditor.DefaultOptions={ loadingCollectionText:'Loading options...' }; Form.Element.DelayedObserver=Class.create({ initialize:function(element,delay,callback){ this.delay=delay||0.5; this.element=$(element); this.callback=callback; this.timer=null; this.lastValue=$F(this.element); Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this)); }, delayedListener:function(event){ if(this.lastValue==$F(this.element))return; if(this.timer)clearTimeout(this.timer); this.timer=setTimeout(this.onTimerEvent.bind(this),this.delay*1000); this.lastValue=$F(this.element); }, onTimerEvent:function(){ this.timer=null; this.callback(this.element,$F(this.element)); } }); if(!Control)var Control={}; Control.Slider=Class.create({ initialize:function(handle,track,options){ var slider=this; if(Object.isArray(handle)){ this.handles=handle.collect(function(e){return $(e)}); }else{ this.handles=[$(handle)]; } this.track=$(track); this.options=options||{}; this.axis=this.options.axis||'horizontal'; this.increment=this.options.increment||1; this.step=parseInt(this.options.step||'1'); this.range=this.options.range||$R(0,1); this.value=0; this.values=this.handles.map(function(){return 0}); this.spans=this.options.spans?this.options.spans.map(function(s){return $(s)}):false; this.options.startSpan=$(this.options.startSpan||null); this.options.endSpan=$(this.options.endSpan||null); this.restricted=this.options.restricted||false; this.maximum=this.options.maximum||this.range.end; this.minimum=this.options.minimum||this.range.start; this.alignX=parseInt(this.options.alignX||'0'); this.alignY=parseInt(this.options.alignY||'0'); this.trackLength=this.maximumOffset()-this.minimumOffset(); this.handleLength=this.isVertical()? (this.handles[0].offsetHeight!=0? this.handles[0].offsetHeight:this.handles[0].style.height.replace(/px$/,"")): (this.handles[0].offsetWidth!=0?this.handles[0].offsetWidth: this.handles[0].style.width.replace(/px$/,"")); this.active=false; this.dragging=false; this.disabled=false; if(this.options.disabled)this.setDisabled(); this.allowedValues=this.options.values?this.options.values.sortBy(Prototype.K):false; if(this.allowedValues){ this.minimum=this.allowedValues.min(); this.maximum=this.allowedValues.max(); } this.eventMouseDown=this.startDrag.bindAsEventListener(this); this.eventMouseUp=this.endDrag.bindAsEventListener(this); this.eventMouseMove=this.update.bindAsEventListener(this); this.handles.each(function(h,i){ i=slider.handles.length-1-i; slider.setValue(parseFloat( (Object.isArray(slider.options.sliderValue)? slider.options.sliderValue[i]:slider.options.sliderValue)|| slider.range.start),i); h.makePositioned().observe("mousedown",slider.eventMouseDown); }); this.track.observe("mousedown",this.eventMouseDown); document.observe("mouseup",this.eventMouseUp); $(this.track.parentNode.parentNode).observe("mousemove",this.eventMouseMove); this.initialized=true; }, dispose:function(){ var slider=this; Event.stopObserving(this.track,"mousedown",this.eventMouseDown); Event.stopObserving(document,"mouseup",this.eventMouseUp); Event.stopObserving(this.track.parentNode.parentNode,"mousemove",this.eventMouseMove); this.handles.each(function(h){ Event.stopObserving(h,"mousedown",slider.eventMouseDown); }); }, setDisabled:function(){ this.disabled=true; this.track.parentNode.className=this.track.parentNode.className+' disabled'; }, setEnabled:function(){ this.disabled=false; }, getNearestValue:function(value){ if(this.allowedValues){ if(value>=this.allowedValues.max())return(this.allowedValues.max()); if(value<=this.allowedValues.min())return(this.allowedValues.min()); var offset=Math.abs(this.allowedValues[0]-value); var newValue=this.allowedValues[0]; this.allowedValues.each(function(v){ var currentOffset=Math.abs(v-value); if(currentOffset<=offset){ newValue=v; offset=currentOffset; } }); return newValue; } if(value>this.range.end)return this.range.end; if(value0)&&(sliderValuethis.values[handleIdx+1])) sliderValue=this.values[handleIdx+1]; } sliderValue=this.getNearestValue(sliderValue); this.values[handleIdx]=sliderValue; this.value=this.values[0]; this.handles[handleIdx].style[this.isVertical()?'top':'left']= this.translateToPx(sliderValue); this.drawSpans(); if(!this.dragging||!this.event)this.updateFinished(); }, setValueBy:function(delta,handleIdx){ this.setValue(this.values[handleIdx||this.activeHandleIdx||0]+delta, handleIdx||this.activeHandleIdx||0); }, translateToPx:function(value){ return Math.round( ((this.trackLength-this.handleLength)/(this.range.end-this.range.start))* (value-this.range.start))+"px"; }, translateToValue:function(offset){ return((offset/(this.trackLength-this.handleLength)* (this.range.end-this.range.start))+this.range.start); }, getRange:function(range){ var v=this.values.sortBy(Prototype.K); range=range||0; return $R(v[range],v[range+1]); }, minimumOffset:function(){ return(this.isVertical()?this.alignY:this.alignX); }, maximumOffset:function(){ return(this.isVertical()? (this.track.offsetHeight!=0?this.track.offsetHeight: this.track.style.height.replace(/px$/,""))-this.alignY: (this.track.offsetWidth!=0?this.track.offsetWidth: this.track.style.width.replace(/px$/,""))-this.alignX); }, isVertical:function(){ return(this.axis=='vertical'); }, drawSpans:function(){ var slider=this; if(this.spans) $R(0,this.spans.length-1).each(function(r){slider.setSpan(slider.spans[r],slider.getRange(r))}); if(this.options.startSpan) this.setSpan(this.options.startSpan, $R(0,this.values.length>1?this.getRange(0).min():this.value)); if(this.options.endSpan) this.setSpan(this.options.endSpan, $R(this.values.length>1?this.getRange(this.spans.length-1).max():this.value,this.maximum)); }, setSpan:function(span,range){ if(this.isVertical()){ span.style.top=this.translateToPx(range.start); span.style.height=this.translateToPx(range.end-range.start+this.range.start); }else{ span.style.left=this.translateToPx(range.start); span.style.width=this.translateToPx(range.end-range.start+this.range.start); } }, updateStyles:function(){ this.handles.each(function(h){Element.removeClassName(h,'selected')}); Element.addClassName(this.activeHandle,'selected'); }, startDrag:function(event){ if(Event.isLeftClick(event)){ if(!this.disabled){ this.active=true; var handle=Event.element(event); var pointer=[Event.pointerX(event),Event.pointerY(event)]; var track=handle; if(track==this.track){ var offsets=Position.cumulativeOffset(this.track); this.event=event; this.setValue(this.translateToValue( (this.isVertical()?pointer[1]-offsets[1]:pointer[0]-offsets[0])-(this.handleLength/2) )); var offsets=Position.cumulativeOffset(this.activeHandle); this.offsetX=(pointer[0]-offsets[0]); this.offsetY=(pointer[1]-offsets[1]); }else{ while((this.handles.indexOf(handle)==-1)&&handle.parentNode) handle=handle.parentNode; if(this.handles.indexOf(handle)!=-1){ this.activeHandle=handle; this.activeHandleIdx=this.handles.indexOf(this.activeHandle); this.updateStyles(); var offsets=Position.cumulativeOffset(this.activeHandle); this.offsetX=(pointer[0]-offsets[0]); this.offsetY=(pointer[1]-offsets[1]); } } } Event.stop(event); } }, update:function(event){ if(this.active){ if(!this.dragging)this.dragging=true; this.draw(event); if(Prototype.Browser.WebKit)window.scrollBy(0,0); Event.stop(event); } }, draw:function(event){ var pointer=[Event.pointerX(event),Event.pointerY(event)]; var offsets=Position.cumulativeOffset(this.track); pointer[0]-=this.offsetX+offsets[0]; pointer[1]-=this.offsetY+offsets[1]; this.event=event; this.setValue(this.translateToValue(this.isVertical()?pointer[1]:pointer[0])); if(this.initialized&&this.options.onSlide) this.options.onSlide(this.values.length>1?this.values:this.value,this); }, endDrag:function(event){ if(this.active&&this.dragging){ this.finishDrag(event,true); Event.stop(event); } this.active=false; this.dragging=false; }, finishDrag:function(event,success){ this.active=false; this.dragging=false; this.updateFinished(); }, updateFinished:function(){ if(this.initialized&&this.options.onChange) this.options.onChange(this.values.length>1?this.values:this.value,this); this.event=null; } }); function popWin(url,win,para){ var win=window.open(url,win,para); win.focus(); } function setLocation(url){ window.location.href=url; } function setPLocation(url,setFocus){ if(setFocus){ window.opener.focus(); } window.opener.location.href=url; } function setLanguageCode(code,fromCode){ var href=window.location.href; var after='',dash; if(dash=href.match(/\#(.*)$/)){ href=href.replace(/\#(.*)$/,''); after=dash[0]; } if(href.match(/[?]/)){ var re=/([?&]store=)[a-z0-9_]*/; if(href.match(re)){ href=href.replace(re,'$1'+code); }else{ href+='&store='+code; } var re=/([?&]from_store=)[a-z0-9_]*/; if(href.match(re)){ href=href.replace(re,''); } }else{ href+='?store='+code; } if(typeof(fromCode)!='undefined'){ href+='&from_store='+fromCode; } href+=after; setLocation(href); } function decorateGeneric(elements,decorateParams) { var allSupportedParams=['odd','even','first','last']; var _decorateParams={}; var total=elements.length; if(total){ if(typeof(decorateParams)=='undefined'){ decorateParams=allSupportedParams; } if(!decorateParams.length){ return; } for(var k in allSupportedParams){ _decorateParams[allSupportedParams[k]]=false; } for(var k in decorateParams){ _decorateParams[decorateParams[k]]=true; } if(_decorateParams.first){ Element.addClassName(elements[0],'first'); } if(_decorateParams.last){ Element.addClassName(elements[total-1],'last'); } for(var i=0;igroupLength?j%groupLength:0; re=new RegExp("(\\d{"+groupLength+"})(?=\\d)","g"); r=(j?i.substr(0,j)+groupSymbol:"")+i.substr(j).replace(re,"$1"+groupSymbol)+(precision?decimalSymbol+Math.abs(price-i).toFixed(precision).replace(/-/,0).slice(2):"") if(format.pattern.indexOf('{sign}')==-1){ pattern=s+format.pattern; }else{ pattern=format.pattern.replace('{sign}',s); } return pattern.replace('%s',r).replace(/^\s\s*/,'').replace(/\s\s*$/,''); }; function expandDetails(el,childClass){ if(Element.hasClassName(el,'show-details')){ $$(childClass).each(function(item){item.hide()}); Element.removeClassName(el,'show-details'); } else{ $$(childClass).each(function(item){item.show()}); Element.addClassName(el,'show-details'); } } var isIE=navigator.appVersion.match(/MSIE/)=="MSIE"; if(!window.Varien) var Varien=new Object(); Varien.showLoading=function(){ Element.show('loading-process'); } Varien.hideLoading=function(){ Element.hide('loading-process'); } Varien.GlobalHandlers={ onCreate:function(){ Varien.showLoading(); }, onComplete:function(){ if(Ajax.activeRequestCount==0){ Varien.hideLoading(); } } }; Ajax.Responders.register(Varien.GlobalHandlers); Varien.searchForm=Class.create(); Varien.searchForm.prototype={ initialize:function(form,field,emptyText){ this.form=$(form); this.field=$(field); this.emptyText=emptyText; Event.observe(this.form,'submit',this.submit.bind(this)); Event.observe(this.field,'focus',this.focus.bind(this)); Event.observe(this.field,'blur',this.blur.bind(this)); this.blur(); }, submit:function(event){ if(this.field.value==this.emptyText||this.field.value==''){ Event.stop(event); return false; } return true; }, focus:function(event){ if(this.field.value==this.emptyText){ this.field.value=''; } }, blur:function(event){ if(this.field.value==''){ this.field.value=this.emptyText; } }, initAutocomplete:function(url,destinationElement){ new Ajax.Autocompleter( this.field, destinationElement, url, { paramName:this.field.name, minChars:2, updateElement:this._selectAutocompleteItem.bind(this), onShow:function(element,update){ if(!update.style.position||update.style.position=='absolute'){ update.style.position='absolute'; Position.clone(element,update,{ setHeight:false, offsetTop:element.offsetHeight }); } Effect.Appear(update,{duration:0}); } } ); }, _selectAutocompleteItem:function(element){ if(element.title){ this.field.value=element.title; } this.form.submit(); } } Varien.Tabs=Class.create(); Varien.Tabs.prototype={ initialize:function(selector){ var self=this; $$(selector+' a').each(this.initTab.bind(this)); }, initTab:function(el){ el.href='javascript:void(0)'; if($(el.parentNode).hasClassName('active')){ this.showContent(el); } el.observe('click',this.showContent.bind(this,el)); }, showContent:function(a){ var li=$(a.parentNode),ul=$(li.parentNode); ul.getElementsBySelector('li','ol').each(function(el){ var contents=$(el.id+'_contents'); if(el==li){ el.addClassName('active'); contents.show(); }else{ el.removeClassName('active'); contents.hide(); } }); } } Varien.DOB=Class.create(); Varien.DOB.prototype={ initialize:function(selector,required,format){ var el=$$(selector)[0]; this.day=Element.select($(el),'.dob-day input')[0]; this.month=Element.select($(el),'.dob-month input')[0]; this.year=Element.select($(el),'.dob-year input')[0]; this.dob=Element.select($(el),'.dob-full input')[0]; this.advice=Element.select($(el),'.validation-advice')[0]; this.required=required; this.format=format; this.day.validate=this.validate.bind(this); this.month.validate=this.validate.bind(this); this.year.validate=this.validate.bind(this); this.advice.hide(); }, validate:function(){ var error=false; if(this.day.value==''&&this.month.value==''&&this.year.value==''){ if(this.required){ error='This date is a required value.'; }else{ this.dob.value=''; } }else if(this.day.value==''||this.month.value==''||this.year.value==''){ error='Please enter a valid full date.'; }else{ var date=new Date(); if(this.day.value<1||this.day.value>31){ error='Please enter a valid day (1-31).'; }else if(this.month.value<1||this.month.value>12){ error='Please enter a valid month (1-12).'; }else if(this.year.value<1900||this.year.value>date.getFullYear()){ error='Please enter a valid year (1900-'+date.getFullYear()+').'; }else{ this.dob.value=this.format.replace(/(%m|%b)/i,this.month.value).replace(/(%d|%e)/i,this.day.value).replace(/%y/i,this.year.value); var testDOB=this.month.value+'/'+this.day.value+'/'+this.year.value; var test=new Date(testDOB); if(isNaN(test)){ error='Please enter a valid date.'; } } } if(error!==false){ try{ this.advice.innerHTML=Translator.translate(error); } catch(e){ this.advice.innerHTML=error; } this.advice.show(); return false; } this.advice.hide(); return true; } } Validation.addAllThese([ ['validate-custom',' ',function(v,elm){ return elm.validate(); }] ]); function truncateOptions(){ $$('.truncated').each(function(element){ Event.observe(element,'mouseover',function(){ if(element.down('div.truncated_full_value')){ element.down('div.truncated_full_value').addClassName('show') } }); Event.observe(element,'mouseout',function(){ if(element.down('div.truncated_full_value')){ element.down('div.truncated_full_value').removeClassName('show') } }); }); } Event.observe(window,'load',function(){ truncateOptions(); }); VarienForm=Class.create(); VarienForm.prototype={ initialize:function(formId,firstFieldFocus){ this.form=$(formId); if(!this.form){ return; } this.cache=$A(); this.currLoader=false; this.currDataIndex=false; this.validator=new Validation(this.form); this.elementFocus=this.elementOnFocus.bindAsEventListener(this); this.elementBlur=this.elementOnBlur.bindAsEventListener(this); this.childLoader=this.onChangeChildLoad.bindAsEventListener(this); this.highlightClass='highlight'; this.extraChildParams=''; this.firstFieldFocus=firstFieldFocus||false; this.bindElements(); if(this.firstFieldFocus){ try{ Form.Element.focus(Form.findFirstElement(this.form)) } catch(e){} } }, submit:function(url){ if(this.validator&&this.validator.validate()){ this.form.submit(); } return false; }, bindElements:function(){ var elements=Form.getElements(this.form); for(var row in elements){ if(elements[row].id){ Event.observe(elements[row],'focus',this.elementFocus); Event.observe(elements[row],'blur',this.elementBlur); } } }, elementOnFocus:function(event){ var element=Event.findElement(event,'fieldset'); if(element){ Element.addClassName(element,this.highlightClass); } }, elementOnBlur:function(event){ var element=Event.findElement(event,'fieldset'); if(element){ Element.removeClassName(element,this.highlightClass); } }, setElementsRelation:function(parent,child,dataUrl,first){ if(parent=$(parent)){ if(!this.cache[parent.id]){ this.cache[parent.id]=$A(); this.cache[parent.id]['child']=child; this.cache[parent.id]['dataUrl']=dataUrl; this.cache[parent.id]['data']=$A(); this.cache[parent.id]['first']=first||false; } Event.observe(parent,'change',this.childLoader); } }, onChangeChildLoad:function(event){ element=Event.element(event); this.elementChildLoad(element); }, elementChildLoad:function(element,callback){ this.callback=callback||false; if(element.value){ this.currLoader=element.id; this.currDataIndex=element.value; if(this.cache[element.id]['data'][element.value]){ this.setDataToChild(this.cache[element.id]['data'][element.value]); } else{ new Ajax.Request(this.cache[this.currLoader]['dataUrl'],{ method:'post', parameters:{"parent":element.value}, onComplete:this.reloadChildren.bind(this) }); } } }, reloadChildren:function(transport){ var data=eval('('+transport.responseText+')'); this.cache[this.currLoader]['data'][this.currDataIndex]=data; this.setDataToChild(data); }, setDataToChild:function(data){ if(data.length){ var child=$(this.cache[this.currLoader]['child']); if(child){ var html=''; Element.insert(child,{before:html}); Element.remove(child); } } else{ var child=$(this.cache[this.currLoader]['child']); if(child){ var html=''; Element.insert(child,{before:html}); Element.remove(child); } } this.bindElements(); if(this.callback){ this.callback(); } } } RegionUpdater=Class.create(); RegionUpdater.prototype={ initialize:function(countryEl,regionTextEl,regionSelectEl,regions,disableAction) { this.countryEl=$(countryEl); this.regionTextEl=$(regionTextEl); this.regionSelectEl=$(regionSelectEl); this.regions=regions; this.disableAction=(typeof disableAction=='undefined')?'hide':disableAction; if(this.regionSelectEl.options.length<=1){ this.update(); } Event.observe(this.countryEl,'change',this.update.bind(this)); }, update:function() { if(this.regions[this.countryEl.value]){ var i,option,region,def; if(this.regionTextEl){ def=this.regionTextEl.value.toLowerCase(); this.regionTextEl.value=''; } if(!def){ def=this.regionSelectEl.getAttribute('defaultValue'); } this.regionSelectEl.options.length=1; for(regionId in this.regions[this.countryEl.value]){ region=this.regions[this.countryEl.value][regionId]; option=document.createElement('OPTION'); option.value=regionId; option.text=region.name; if(this.regionSelectEl.options.add){ this.regionSelectEl.options.add(option); }else{ this.regionSelectEl.appendChild(option); } if(regionId==def||region.name.toLowerCase()==def||region.code.toLowerCase()==def){ this.regionSelectEl.value=regionId; } } if(this.disableAction=='hide'){ if(this.regionTextEl){ this.regionTextEl.style.display='none'; } this.regionSelectEl.style.display=''; }else if(this.disableAction=='disable'){ if(this.regionTextEl){ this.regionTextEl.disabled=true; } this.regionSelectEl.disabled=false; } this.setMarkDisplay(this.regionSelectEl,true); }else{ if(this.disableAction=='hide'){ if(this.regionTextEl){ this.regionTextEl.style.display=''; } this.regionSelectEl.style.display='none'; Validation.reset(this.regionSelectEl); }else if(this.disableAction=='disable'){ if(this.regionTextEl){ this.regionTextEl.disabled=false; } this.regionSelectEl.disabled=true; }else if(this.disableAction=='nullify'){ this.regionSelectEl.options.length=1; this.regionSelectEl.value=''; this.regionSelectEl.selectedIndex=0; this.lastCountryId=''; } this.setMarkDisplay(this.regionSelectEl,false); } }, setMarkDisplay:function(elem,display){ elem=$(elem); var labelElement=elem.up(1).down('label > span.required')|| elem.up(2).down('label > span.required')|| elem.up(1).down('label.required > em')|| elem.up(2).down('label.required > em'); if(labelElement){ display?labelElement.show():labelElement.hide(); } } } function toggleMenu(el,over) { if(over){ Element.addClassName(el,'over'); } else{ Element.removeClassName(el,'over'); } } var Translate=Class.create(); Translate.prototype={ initialize:function(data){ this.data=$H(data); }, translate:function(){ var args=arguments; var text=arguments[0]; if(this.data.get(text)){ return this.data.get(text); } return text; }, add:function(){ if(arguments.length>1){ this.data.set(arguments[0],arguments[1]); }else if(typeof arguments[0]=='object'){ $H(arguments[0]).each(function(pair){ this.data.set(pair.key,pair.value); }.bind(this)); } } } if(!window.Mage)var Mage={}; Mage.Cookies={}; Mage.Cookies.set=function(name,value){ var argv=arguments; var argc=arguments.length; var expires=(argc>2)?argv[2]:null; var path=(argc>3)?argv[3]:'/'; var domain=(argc>4)?argv[4]:null; var secure=(argc>5)?argv[5]:false; document.cookie=name+"="+escape(value)+ ((expires==null)?"":("; expires="+expires.toGMTString()))+ ((path==null)?"":("; path="+path))+ ((domain==null)?"":("; domain="+domain))+ ((secure==true)?"; secure":""); }; Mage.Cookies.get=function(name){ var arg=name+"="; var alen=arg.length; var clen=document.cookie.length; var i=0; var j=0; while(i= options.elements.length) { log('invalid slide index: ' + num); return false; } options.nextSlide = num; if (cont.cycleTimeout) { clearTimeout(cont.cycleTimeout); cont.cycleTimeout = 0; } if (typeof arg2 == 'string') options.oneTimeFx = arg2; go(options.elements, options, 1, num >= options.currSlide); return false; } return options; }; function removeFilter(el, opts) { if (!$.support.opacity && opts.cleartype && el.style.filter) { try { el.style.removeAttribute('filter'); } catch(smother) {} // handle old opera versions } }; // one-time initialization function buildOptions($cont, $slides, els, options, o) { // support metadata plugin (v1.0 and v2.0) var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {}); if (opts.autostop) opts.countdown = opts.autostopCount || els.length; var cont = $cont[0]; $cont.data('cycle.opts', opts); opts.$cont = $cont; opts.stopCount = cont.cycleStop; opts.elements = els; opts.before = opts.before ? [opts.before] : []; opts.after = opts.after ? [opts.after] : []; opts.after.unshift(function(){ opts.busy=0; }); // push some after callbacks if (!$.support.opacity && opts.cleartype) opts.after.push(function() { removeFilter(this, opts); }); if (opts.continuous) opts.after.push(function() { go(els,opts,0,!opts.rev); }); saveOriginalOpts(opts); // clearType corrections if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg) clearTypeFix($slides); // container requires non-static position so that slides can be position within if ($cont.css('position') == 'static') $cont.css('position', 'relative'); if (opts.width) $cont.width(opts.width); if (opts.height && opts.height != 'auto') $cont.height(opts.height); if (opts.startingSlide) opts.startingSlide = parseInt(opts.startingSlide); // if random, mix up the slide array if (opts.random) { opts.randomMap = []; for (var i = 0; i < els.length; i++) opts.randomMap.push(i); opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;}); opts.randomIndex = 0; opts.startingSlide = opts.randomMap[0]; } else if (opts.startingSlide >= els.length) opts.startingSlide = 0; // catch bogus input opts.currSlide = opts.startingSlide = opts.startingSlide || 0; var first = opts.startingSlide; // set position and zIndex on all the slides $slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) { var z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i; $(this).css('z-index', z) }); // make sure first slide is visible $(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case removeFilter(els[first], opts); // stretch slides if (opts.fit && opts.width) $slides.width(opts.width); if (opts.fit && opts.height && opts.height != 'auto') $slides.height(opts.height); // stretch container var reshape = opts.containerResize && !$cont.innerHeight(); if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9 var maxw = 0, maxh = 0; for(var j=0; j < els.length; j++) { var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight(); if (!w) w = e.offsetWidth; if (!h) h = e.offsetHeight; maxw = w > maxw ? w : maxw; maxh = h > maxh ? h : maxh; } if (maxw > 0 && maxh > 0) $cont.css({width:maxw+'px',height:maxh+'px'}); } if (opts.pause) $cont.hover(function(){this.cyclePause++;},function(){this.cyclePause--;}); if (supportMultiTransitions(opts) === false) return false; // apparently a lot of people use image slideshows without height/width attributes on the images. // Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that. var requeue = false; options.requeueAttempts = options.requeueAttempts || 0; $slides.each(function() { // try to get height/width of each slide var $el = $(this); this.cycleH = (opts.fit && opts.height) ? opts.height : $el.height(); this.cycleW = (opts.fit && opts.width) ? opts.width : $el.width(); if ( $el.is('div') ) { // sigh.. sniffing, hacking, shrugging... this crappy hack tries to account for what browsers do when // an image is being downloaded and the markup did not include sizing info (height/width attributes); // there seems to be some "default" sizes used in this situation var loadingIE = ($.browser.msie && this.cycleW == 28 && this.cycleH == 30 && !this.complete); var loadingFF = ($.browser.mozilla && this.cycleW == 34 && this.cycleH == 19 && !this.complete); var loadingOp = ($.browser.opera && ((this.cycleW == 42 && this.cycleH == 19) || (this.cycleW == 37 && this.cycleH == 17)) && !this.complete); var loadingOther = (this.cycleH == 0 && this.cycleW == 0 && !this.complete); // don't requeue for images that are still loading but have a valid size if (loadingIE || loadingFF || loadingOp || loadingOther) { if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH); setTimeout(function() {$(o.s,o.c).cycle(options)}, opts.requeueTimeout); requeue = true; return false; // break each loop } else { log('could not determine size of image: '+this.src, this.cycleW, this.cycleH); } } } return true; }); if (requeue) return false; opts.cssBefore = opts.cssBefore || {}; opts.animIn = opts.animIn || {}; opts.animOut = opts.animOut || {}; $slides.not(':eq('+first+')').css(opts.cssBefore); if (opts.cssFirst) $($slides[first]).css(opts.cssFirst); if (opts.timeout) { opts.timeout = parseInt(opts.timeout); // ensure that timeout and speed settings are sane if (opts.speed.constructor == String) opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed); if (!opts.sync) opts.speed = opts.speed / 2; while((opts.timeout - opts.speed) < 250) // sanitize timeout opts.timeout += opts.speed; } if (opts.easing) opts.easeIn = opts.easeOut = opts.easing; if (!opts.speedIn) opts.speedIn = opts.speed; if (!opts.speedOut) opts.speedOut = opts.speed; opts.slideCount = els.length; opts.currSlide = opts.lastSlide = first; if (opts.random) { opts.nextSlide = opts.currSlide; if (++opts.randomIndex == els.length) opts.randomIndex = 0; opts.nextSlide = opts.randomMap[opts.randomIndex]; } else opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1; // run transition init fn if (!opts.multiFx) { var init = $.fn.cycle.transitions[opts.fx]; if ($.isFunction(init)) init($cont, $slides, opts); else if (opts.fx != 'custom' && !opts.multiFx) { log('unknown transition: ' + opts.fx,'; slideshow terminating'); return false; } } // fire artificial events var e0 = $slides[first]; if (opts.before.length) opts.before[0].apply(e0, [e0, e0, opts, true]); if (opts.after.length > 1) opts.after[1].apply(e0, [e0, e0, opts, true]); if (opts.next) $(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?-1:1)}); if (opts.prev) $(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?1:-1)}); if (opts.pager) buildPager(els,opts); exposeAddSlide(opts, els); return opts; }; // save off original opts so we can restore after clearing state function saveOriginalOpts(opts) { opts.original = { before: [], after: [] }; opts.original.cssBefore = $.extend({}, opts.cssBefore); opts.original.cssAfter = $.extend({}, opts.cssAfter); opts.original.animIn = $.extend({}, opts.animIn); opts.original.animOut = $.extend({}, opts.animOut); $.each(opts.before, function() { opts.original.before.push(this); }); $.each(opts.after, function() { opts.original.after.push(this); }); }; function supportMultiTransitions(opts) { var i, tx, txs = $.fn.cycle.transitions; // look for multiple effects if (opts.fx.indexOf(',') > 0) { opts.multiFx = true; opts.fxs = opts.fx.replace(/\s*/g,'').split(','); // discard any bogus effect names for (i=0; i < opts.fxs.length; i++) { var fx = opts.fxs[i]; tx = txs[fx]; if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) { log('discarding unknown transition: ',fx); opts.fxs.splice(i,1); i--; } } // if we have an empty list then we threw everything away! if (!opts.fxs.length) { log('No valid transitions named; slideshow terminating.'); return false; } } else if (opts.fx == 'all') { // auto-gen the list of transitions opts.multiFx = true; opts.fxs = []; for (p in txs) { tx = txs[p]; if (txs.hasOwnProperty(p) && $.isFunction(tx)) opts.fxs.push(p); } } if (opts.multiFx && opts.randomizeEffects) { // munge the fxs array to make effect selection random var r1 = Math.floor(Math.random() * 20) + 30; for (i = 0; i < r1; i++) { var r2 = Math.floor(Math.random() * opts.fxs.length); opts.fxs.push(opts.fxs.splice(r2,1)[0]); } debug('randomized fx sequence: ',opts.fxs); } return true; }; // provide a mechanism for adding slides after the slideshow has started function exposeAddSlide(opts, els) { opts.addSlide = function(newSlide, prepend) { var $s = $(newSlide), s = $s[0]; if (!opts.autostopCount) opts.countdown++; els[prepend?'unshift':'push'](s); if (opts.els) opts.els[prepend?'unshift':'push'](s); // shuffle needs this opts.slideCount = els.length; $s.css('position','absolute'); $s[prepend?'prependTo':'appendTo'](opts.$cont); if (prepend) { opts.currSlide++; opts.nextSlide++; } if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg) clearTypeFix($s); if (opts.fit && opts.width) $s.width(opts.width); if (opts.fit && opts.height && opts.height != 'auto') $slides.height(opts.height); s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height(); s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width(); $s.css(opts.cssBefore); if (opts.pager) $.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts); if ($.isFunction(opts.onAddSlide)) opts.onAddSlide($s); else $s.hide(); // default behavior }; } // reset internal state; we do this on every pass in order to support multiple effects $.fn.cycle.resetState = function(opts, fx) { fx = fx || opts.fx; opts.before = []; opts.after = []; opts.cssBefore = $.extend({}, opts.original.cssBefore); opts.cssAfter = $.extend({}, opts.original.cssAfter); opts.animIn = $.extend({}, opts.original.animIn); opts.animOut = $.extend({}, opts.original.animOut); opts.fxFn = null; $.each(opts.original.before, function() { opts.before.push(this); }); $.each(opts.original.after, function() { opts.after.push(this); }); // re-init var init = $.fn.cycle.transitions[fx]; if ($.isFunction(init)) init(opts.$cont, $(opts.elements), opts); }; // this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt function go(els, opts, manual, fwd) { // opts.busy is true if we're in the middle of an animation if (manual && opts.busy && opts.manualTrump) { // let manual transitions requests trump active ones $(els).stop(true,true); opts.busy = false; } // don't begin another timeout-based transition if there is one active if (opts.busy) return; var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide]; // stop cycling if we have an outstanding stop request if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual) return; // check to see if we should stop cycling based on autostop options if (!manual && !p.cyclePause && ((opts.autostop && (--opts.countdown <= 0)) || (opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) { if (opts.end) opts.end(opts); return; } // if slideshow is paused, only transition on a manual trigger if (manual || !p.cyclePause) { var fx = opts.fx; // keep trying to get the slide size if we don't have it yet curr.cycleH = curr.cycleH || $(curr).height(); curr.cycleW = curr.cycleW || $(curr).width(); next.cycleH = next.cycleH || $(next).height(); next.cycleW = next.cycleW || $(next).width(); // support multiple transition types if (opts.multiFx) { if (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length) opts.lastFx = 0; fx = opts.fxs[opts.lastFx]; opts.currFx = fx; } // one-time fx overrides apply to: $('div').cycle(3,'zoom'); if (opts.oneTimeFx) { fx = opts.oneTimeFx; opts.oneTimeFx = null; } $.fn.cycle.resetState(opts, fx); // run the before callbacks if (opts.before.length) $.each(opts.before, function(i,o) { if (p.cycleStop != opts.stopCount) return; o.apply(next, [curr, next, opts, fwd]); }); // stage the after callacks var after = function() { $.each(opts.after, function(i,o) { if (p.cycleStop != opts.stopCount) return; o.apply(next, [curr, next, opts, fwd]); }); }; if (opts.nextSlide != opts.currSlide) { // get ready to perform the transition opts.busy = 1; if (opts.fxFn) // fx function provided? opts.fxFn(curr, next, opts, after, fwd); else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ? $.fn.cycle[opts.fx](curr, next, opts, after); else $.fn.cycle.custom(curr, next, opts, after, manual && opts.fastOnEvent); } // calculate the next slide opts.lastSlide = opts.currSlide; if (opts.random) { opts.currSlide = opts.nextSlide; if (++opts.randomIndex == els.length) opts.randomIndex = 0; opts.nextSlide = opts.randomMap[opts.randomIndex]; } else { // sequence var roll = (opts.nextSlide + 1) == els.length; opts.nextSlide = roll ? 0 : opts.nextSlide+1; opts.currSlide = roll ? els.length-1 : opts.nextSlide-1; } if (opts.pager) $.fn.cycle.updateActivePagerLink(opts.pager, opts.currSlide); } // stage the next transition var ms = 0; if (opts.timeout && !opts.continuous) ms = getTimeout(curr, next, opts, fwd); else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic ms = 10; if (ms > 0) p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.rev) }, ms); }; // invoked after transition $.fn.cycle.updateActivePagerLink = function(pager, currSlide) { $(pager).each(function() { $(this).find('a').removeClass('activeSlide').filter('a:eq('+currSlide+')').addClass('activeSlide'); }); }; // calculate timeout value for current transition function getTimeout(curr, next, opts, fwd) { if (opts.timeoutFn) { // call user provided calc fn var t = opts.timeoutFn(curr,next,opts,fwd); while ((t - opts.speed) < 250) // sanitize timeout t += opts.speed; debug('calculated timeout: ' + t + '; speed: ' + opts.speed); if (t !== false) return t; } return opts.timeout; }; // expose next/prev function, caller must pass in state $.fn.cycle.next = function(opts) { advance(opts, opts.rev?-1:1); }; $.fn.cycle.prev = function(opts) { advance(opts, opts.rev?1:-1);}; // advance slide forward or back function advance(opts, val) { var els = opts.elements; var p = opts.$cont[0], timeout = p.cycleTimeout; if (timeout) { clearTimeout(timeout); p.cycleTimeout = 0; } if (opts.random && val < 0) { // move back to the previously display slide opts.randomIndex--; if (--opts.randomIndex == -2) opts.randomIndex = els.length-2; else if (opts.randomIndex == -1) opts.randomIndex = els.length-1; opts.nextSlide = opts.randomMap[opts.randomIndex]; } else if (opts.random) { if (++opts.randomIndex == els.length) opts.randomIndex = 0; opts.nextSlide = opts.randomMap[opts.randomIndex]; } else { opts.nextSlide = opts.currSlide + val; if (opts.nextSlide < 0) { if (opts.nowrap) return false; opts.nextSlide = els.length - 1; } else if (opts.nextSlide >= els.length) { if (opts.nowrap) return false; opts.nextSlide = 0; } } if ($.isFunction(opts.prevNextClick)) opts.prevNextClick(val > 0, opts.nextSlide, els[opts.nextSlide]); go(els, opts, 1, val>=0); return false; }; function buildPager(els, opts) { var $p = $(opts.pager); $.each(els, function(i,o) { $.fn.cycle.createPagerAnchor(i,o,$p,els,opts); }); $.fn.cycle.updateActivePagerLink(opts.pager, opts.startingSlide); }; $.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) { var a; if ($.isFunction(opts.pagerAnchorBuilder)) a = opts.pagerAnchorBuilder(i,el); else a = ''+(i+1)+''; if (!a) return; var $a = $(a); // don't reparent if anchor is in the dom if ($a.parents('body').length === 0) { var arr = []; if ($p.length > 1) { $p.each(function() { var $clone = $a.clone(true); $(this).append($clone); arr.push($clone[0]); }); $a = $(arr); } else { $a.appendTo($p); } } $a.bind(opts.pagerEvent, function(e) { e.preventDefault(); opts.nextSlide = i; var p = opts.$cont[0], timeout = p.cycleTimeout; if (timeout) { clearTimeout(timeout); p.cycleTimeout = 0; } if ($.isFunction(opts.pagerClick)) opts.pagerClick(opts.nextSlide, els[opts.nextSlide]); go(els,opts,1,opts.currSlide < i); // trigger the trans return false; }); if (opts.pagerEvent != 'click') $a.click(function(){return false;}); // supress click if (opts.pauseOnPagerHover) $a.hover(function() { opts.$cont[0].cyclePause++; }, function() { opts.$cont[0].cyclePause--; } ); }; // helper fn to calculate the number of slides between the current and the next $.fn.cycle.hopsFromLast = function(opts, fwd) { var hops, l = opts.lastSlide, c = opts.currSlide; if (fwd) hops = c > l ? c - l : opts.slideCount - l; else hops = c < l ? l - c : l + opts.slideCount - c; return hops; }; // fix clearType problems in ie6 by setting an explicit bg color // (otherwise text slides look horrible during a fade transition) function clearTypeFix($slides) { function hex(s) { s = parseInt(s).toString(16); return s.length < 2 ? '0'+s : s; }; function getBg(e) { for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) { var v = $.css(e,'background-color'); if (v.indexOf('rgb') >= 0 ) { var rgb = v.match(/\d+/g); return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]); } if (v && v != 'transparent') return v; } return 'transparent'; }; $slides.each(function() { $(this).css('background-color', getBg(this)); }); }; // reset common props before the next transition $.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) { $(opts.elements).not(curr).hide(); opts.cssBefore.opacity = 1; opts.cssBefore.display = 'block'; if (w !== false && next.cycleW > 0) opts.cssBefore.width = next.cycleW; if (h !== false && next.cycleH > 0) opts.cssBefore.height = next.cycleH; opts.cssAfter = opts.cssAfter || {}; opts.cssAfter.display = 'none'; $(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0)); $(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1)); }; // the actual fn for effecting a transition $.fn.cycle.custom = function(curr, next, opts, cb, speedOverride) { var $l = $(curr), $n = $(next); var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut; $n.css(opts.cssBefore); if (speedOverride) { if (typeof speedOverride == 'number') speedIn = speedOut = speedOverride; else speedIn = speedOut = 1; easeIn = easeOut = null; } var fn = function() {$n.animate(opts.animIn, speedIn, easeIn, cb)}; $l.animate(opts.animOut, speedOut, easeOut, function() { if (opts.cssAfter) $l.css(opts.cssAfter); if (!opts.sync) fn(); }); if (opts.sync) fn(); }; // transition definitions - only fade is defined here, transition pack defines the rest $.fn.cycle.transitions = { fade: function($cont, $slides, opts) { $slides.not(':eq('+opts.currSlide+')').css('opacity',0); opts.before.push(function(curr,next,opts) { $.fn.cycle.commonReset(curr,next,opts); opts.cssBefore.opacity = 0; }); opts.animIn = { opacity: 1 }; opts.animOut = { opacity: 0 }; opts.cssBefore = { top: 0, left: 0 }; } }; $.fn.cycle.ver = function() { return ver; }; // override these globally if you like (they are all optional) $.fn.cycle.defaults = { fx: 'fade', // name of transition effect (or comma separated names, ex: fade,scrollUp,shuffle) timeout: 4000, // milliseconds between slide transitions (0 to disable auto advance) timeoutFn: null, // callback for determining per-slide timeout value: function(currSlideElement, nextSlideElement, options, forwardFlag) continuous: 0, // true to start next transition immediately after current one completes speed: 1000, // speed of the transition (any valid fx speed value) speedIn: null, // speed of the 'in' transition speedOut: null, // speed of the 'out' transition next: null, // selector for element to use as click trigger for next slide prev: null, // selector for element to use as click trigger for previous slide prevNextClick: null, // callback fn for prev/next clicks: function(isNext, zeroBasedSlideIndex, slideElement) prevNextEvent:'click',// event which drives the manual transition to the previous or next slide pager: null, // selector for element to use as pager container pagerClick: null, // callback fn for pager clicks: function(zeroBasedSlideIndex, slideElement) pagerEvent: 'click', // name of event which drives the pager navigation pagerAnchorBuilder: null, // callback fn for building anchor links: function(index, DOMelement) before: null, // transition callback (scope set to element to be shown): function(currSlideElement, nextSlideElement, options, forwardFlag) after: null, // transition callback (scope set to element that was shown): function(currSlideElement, nextSlideElement, options, forwardFlag) end: null, // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options) easing: null, // easing method for both in and out transitions easeIn: null, // easing for "in" transition easeOut: null, // easing for "out" transition shuffle: null, // coords for shuffle animation, ex: { top:15, left: 200 } animIn: null, // properties that define how the slide animates in animOut: null, // properties that define how the slide animates out cssBefore: null, // properties that define the initial state of the slide before transitioning in cssAfter: null, // properties that defined the state of the slide after transitioning out fxFn: null, // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag) height: 'auto', // container height startingSlide: 0, // zero-based index of the first slide to be displayed sync: 1, // true if in/out transitions should occur simultaneously random: 0, // true for random, false for sequence (not applicable to shuffle fx) fit: 0, // force slides to fit container containerResize: 1, // resize container to fit largest slide pause: 0, // true to enable "pause on hover" pauseOnPagerHover: 0, // true to pause when hovering over pager link autostop: 0, // true to end slideshow after X transitions (where X == slide count) autostopCount: 0, // number of transitions (optionally used with autostop to define X) delay: 0, // additional delay (in ms) for first transition (hint: can be negative) slideExpr: null, // expression for selecting slides (if something other than all children is required) cleartype: !$.support.opacity, // true if clearType corrections should be applied (for IE) cleartypeNoBg: false, // set to true to disable extra cleartype fixing (leave false to force background color setting on slides) nowrap: 0, // true to prevent slideshow from wrapping fastOnEvent: 0, // force fast transitions when triggered manually (via pager or prev/next); value == time in ms randomizeEffects: 1, // valid when multiple effects are used; true to make the effect sequence random rev: 0, // causes animations to transition in reverse manualTrump: true, // causes manual transition to stop an active transition instead of being ignored requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded requeueTimeout: 250 // ms delay for requeue }; })(jQuery); /*! * jQuery Cycle Plugin Transition Definitions * This script is a plugin for the jQuery Cycle Plugin * Examples and documentation at: http://malsup.com/jquery/cycle/ * Copyright (c) 2007-2008 M. Alsup * Version: 2.72 * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html */ (function($) { // // These functions define one-time slide initialization for the named // transitions. To save file size feel free to remove any of these that you // don't need. // $.fn.cycle.transitions.none = function($cont, $slides, opts) { opts.fxFn = function(curr,next,opts,after){ $(next).show(); $(curr).hide(); after(); }; } // scrollUp/Down/Left/Right $.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) { $cont.css('overflow','hidden'); opts.before.push($.fn.cycle.commonReset); var h = $cont.height(); opts.cssBefore ={ top: h, left: 0 }; opts.cssFirst = { top: 0 }; opts.animIn = { top: 0 }; opts.animOut = { top: -h }; }; $.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) { $cont.css('overflow','hidden'); opts.before.push($.fn.cycle.commonReset); var h = $cont.height(); opts.cssFirst = { top: 0 }; opts.cssBefore= { top: -h, left: 0 }; opts.animIn = { top: 0 }; opts.animOut = { top: h }; }; $.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) { $cont.css('overflow','hidden'); opts.before.push($.fn.cycle.commonReset); var w = $cont.width(); opts.cssFirst = { left: 0 }; opts.cssBefore= { left: w, top: 0 }; opts.animIn = { left: 0 }; opts.animOut = { left: 0-w }; }; $.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) { $cont.css('overflow','hidden'); opts.before.push($.fn.cycle.commonReset); var w = $cont.width(); opts.cssFirst = { left: 0 }; opts.cssBefore= { left: -w, top: 0 }; opts.animIn = { left: 0 }; opts.animOut = { left: w }; }; $.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) { $cont.css('overflow','hidden').width(); opts.before.push(function(curr, next, opts, fwd) { $.fn.cycle.commonReset(curr,next,opts); opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW); opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW; }); opts.cssFirst = { left: 0 }; opts.cssBefore= { top: 0 }; opts.animIn = { left: 0 }; opts.animOut = { top: 0 }; }; $.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) { $cont.css('overflow','hidden'); opts.before.push(function(curr, next, opts, fwd) { $.fn.cycle.commonReset(curr,next,opts); opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1); opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH; }); opts.cssFirst = { top: 0 }; opts.cssBefore= { left: 0 }; opts.animIn = { top: 0 }; opts.animOut = { left: 0 }; }; // slideX/slideY $.fn.cycle.transitions.slideX = function($cont, $slides, opts) { opts.before.push(function(curr, next, opts) { $(opts.elements).not(curr).hide(); $.fn.cycle.commonReset(curr,next,opts,false,true); opts.animIn.width = next.cycleW; }); opts.cssBefore = { left: 0, top: 0, width: 0 }; opts.animIn = { width: 'show' }; opts.animOut = { width: 0 }; }; $.fn.cycle.transitions.slideY = function($cont, $slides, opts) { opts.before.push(function(curr, next, opts) { $(opts.elements).not(curr).hide(); $.fn.cycle.commonReset(curr,next,opts,true,false); opts.animIn.height = next.cycleH; }); opts.cssBefore = { left: 0, top: 0, height: 0 }; opts.animIn = { height: 'show' }; opts.animOut = { height: 0 }; }; // shuffle $.fn.cycle.transitions.shuffle = function($cont, $slides, opts) { var i, w = $cont.css('overflow', 'visible').width(); $slides.css({left: 0, top: 0}); opts.before.push(function(curr,next,opts) { $.fn.cycle.commonReset(curr,next,opts,true,true,true); }); // only adjust speed once! if (!opts.speedAdjusted) { opts.speed = opts.speed / 2; // shuffle has 2 transitions opts.speedAdjusted = true; } opts.random = 0; opts.shuffle = opts.shuffle || {left:-w, top:15}; opts.els = []; for (i=0; i < $slides.length; i++) opts.els.push($slides[i]); for (i=0; i < opts.currSlide; i++) opts.els.push(opts.els.shift()); // custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!) opts.fxFn = function(curr, next, opts, cb, fwd) { var $el = fwd ? $(curr) : $(next); $(next).css(opts.cssBefore); var count = opts.slideCount; $el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() { var hops = $.fn.cycle.hopsFromLast(opts, fwd); for (var k=0; k < hops; k++) fwd ? opts.els.push(opts.els.shift()) : opts.els.unshift(opts.els.pop()); if (fwd) { for (var i=0, len=opts.els.length; i < len; i++) $(opts.els[i]).css('z-index', len-i+count); } else { var z = $(curr).css('z-index'); $el.css('z-index', parseInt(z)+1+count); } $el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() { $(fwd ? this : curr).hide(); if (cb) cb(); }); }); }; opts.cssBefore = { display: 'block', opacity: 1, top: 0, left: 0 }; }; // turnUp/Down/Left/Right $.fn.cycle.transitions.turnUp = function($cont, $slides, opts) { opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts,true,false); opts.cssBefore.top = next.cycleH; opts.animIn.height = next.cycleH; }); opts.cssFirst = { top: 0 }; opts.cssBefore = { left: 0, height: 0 }; opts.animIn = { top: 0 }; opts.animOut = { height: 0 }; }; $.fn.cycle.transitions.turnDown = function($cont, $slides, opts) { opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts,true,false); opts.animIn.height = next.cycleH; opts.animOut.top = curr.cycleH; }); opts.cssFirst = { top: 0 }; opts.cssBefore = { left: 0, top: 0, height: 0 }; opts.animOut = { height: 0 }; }; $.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) { opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts,false,true); opts.cssBefore.left = next.cycleW; opts.animIn.width = next.cycleW; }); opts.cssBefore = { top: 0, width: 0 }; opts.animIn = { left: 0 }; opts.animOut = { width: 0 }; }; $.fn.cycle.transitions.turnRight = function($cont, $slides, opts) { opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts,false,true); opts.animIn.width = next.cycleW; opts.animOut.left = curr.cycleW; }); opts.cssBefore = { top: 0, left: 0, width: 0 }; opts.animIn = { left: 0 }; opts.animOut = { width: 0 }; }; // zoom $.fn.cycle.transitions.zoom = function($cont, $slides, opts) { opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts,false,false,true); opts.cssBefore.top = next.cycleH/2; opts.cssBefore.left = next.cycleW/2; opts.animIn = { top: 0, left: 0, width: next.cycleW, height: next.cycleH }; opts.animOut = { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 }; }); opts.cssFirst = { top:0, left: 0 }; opts.cssBefore = { width: 0, height: 0 }; }; // fadeZoom $.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) { opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts,false,false); opts.cssBefore.left = next.cycleW/2; opts.cssBefore.top = next.cycleH/2; opts.animIn = { top: 0, left: 0, width: next.cycleW, height: next.cycleH }; }); opts.cssBefore = { width: 0, height: 0 }; opts.animOut = { opacity: 0 }; }; // blindX $.fn.cycle.transitions.blindX = function($cont, $slides, opts) { var w = $cont.css('overflow','hidden').width(); opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts); opts.animIn.width = next.cycleW; opts.animOut.left = curr.cycleW; }); opts.cssBefore = { left: w, top: 0 }; opts.animIn = { left: 0 }; opts.animOut = { left: w }; }; // blindY $.fn.cycle.transitions.blindY = function($cont, $slides, opts) { var h = $cont.css('overflow','hidden').height(); opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts); opts.animIn.height = next.cycleH; opts.animOut.top = curr.cycleH; }); opts.cssBefore = { top: h, left: 0 }; opts.animIn = { top: 0 }; opts.animOut = { top: h }; }; // blindZ $.fn.cycle.transitions.blindZ = function($cont, $slides, opts) { var h = $cont.css('overflow','hidden').height(); var w = $cont.width(); opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts); opts.animIn.height = next.cycleH; opts.animOut.top = curr.cycleH; }); opts.cssBefore = { top: h, left: w }; opts.animIn = { top: 0, left: 0 }; opts.animOut = { top: h, left: w }; }; // growX - grow horizontally from centered 0 width $.fn.cycle.transitions.growX = function($cont, $slides, opts) { opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts,false,true); opts.cssBefore.left = this.cycleW/2; opts.animIn = { left: 0, width: this.cycleW }; opts.animOut = { left: 0 }; }); opts.cssBefore = { width: 0, top: 0 }; }; // growY - grow vertically from centered 0 height $.fn.cycle.transitions.growY = function($cont, $slides, opts) { opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts,true,false); opts.cssBefore.top = this.cycleH/2; opts.animIn = { top: 0, height: this.cycleH }; opts.animOut = { top: 0 }; }); opts.cssBefore = { height: 0, left: 0 }; }; // curtainX - squeeze in both edges horizontally $.fn.cycle.transitions.curtainX = function($cont, $slides, opts) { opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts,false,true,true); opts.cssBefore.left = next.cycleW/2; opts.animIn = { left: 0, width: this.cycleW }; opts.animOut = { left: curr.cycleW/2, width: 0 }; }); opts.cssBefore = { top: 0, width: 0 }; }; // curtainY - squeeze in both edges vertically $.fn.cycle.transitions.curtainY = function($cont, $slides, opts) { opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts,true,false,true); opts.cssBefore.top = next.cycleH/2; opts.animIn = { top: 0, height: next.cycleH }; opts.animOut = { top: curr.cycleH/2, height: 0 }; }); opts.cssBefore = { left: 0, height: 0 }; }; // cover - curr slide covered by next slide $.fn.cycle.transitions.cover = function($cont, $slides, opts) { var d = opts.direction || 'left'; var w = $cont.css('overflow','hidden').width(); var h = $cont.height(); opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts); if (d == 'right') opts.cssBefore.left = -w; else if (d == 'up') opts.cssBefore.top = h; else if (d == 'down') opts.cssBefore.top = -h; else opts.cssBefore.left = w; }); opts.animIn = { left: 0, top: 0}; opts.animOut = { opacity: 1 }; opts.cssBefore = { top: 0, left: 0 }; }; // uncover - curr slide moves off next slide $.fn.cycle.transitions.uncover = function($cont, $slides, opts) { var d = opts.direction || 'left'; var w = $cont.css('overflow','hidden').width(); var h = $cont.height(); opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts,true,true,true); if (d == 'right') opts.animOut.left = w; else if (d == 'up') opts.animOut.top = -h; else if (d == 'down') opts.animOut.top = h; else opts.animOut.left = -w; }); opts.animIn = { left: 0, top: 0 }; opts.animOut = { opacity: 1 }; opts.cssBefore = { top: 0, left: 0 }; }; // toss - move top slide and fade away $.fn.cycle.transitions.toss = function($cont, $slides, opts) { var w = $cont.css('overflow','visible').width(); var h = $cont.height(); opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts,true,true,true); // provide default toss settings if animOut not provided if (!opts.animOut.left && !opts.animOut.top) opts.animOut = { left: w*2, top: -h/2, opacity: 0 }; else opts.animOut.opacity = 0; }); opts.cssBefore = { left: 0, top: 0 }; opts.animIn = { left: 0 }; }; // wipe - clip animation $.fn.cycle.transitions.wipe = function($cont, $slides, opts) { var w = $cont.css('overflow','hidden').width(); var h = $cont.height(); opts.cssBefore = opts.cssBefore || {}; var clip; if (opts.clip) { if (/l2r/.test(opts.clip)) clip = 'rect(0px 0px '+h+'px 0px)'; else if (/r2l/.test(opts.clip)) clip = 'rect(0px '+w+'px '+h+'px '+w+'px)'; else if (/t2b/.test(opts.clip)) clip = 'rect(0px '+w+'px 0px 0px)'; else if (/b2t/.test(opts.clip)) clip = 'rect('+h+'px '+w+'px '+h+'px 0px)'; else if (/zoom/.test(opts.clip)) { var top = parseInt(h/2); var left = parseInt(w/2); clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)'; } } opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)'; var d = opts.cssBefore.clip.match(/(\d+)/g); var t = parseInt(d[0]), r = parseInt(d[1]), b = parseInt(d[2]), l = parseInt(d[3]); opts.before.push(function(curr, next, opts) { if (curr == next) return; var $curr = $(curr), $next = $(next); $.fn.cycle.commonReset(curr,next,opts,true,true,false); opts.cssAfter.display = 'block'; var step = 1, count = parseInt((opts.speedIn / 13)) - 1; (function f() { var tt = t ? t - parseInt(step * (t/count)) : 0; var ll = l ? l - parseInt(step * (l/count)) : 0; var bb = b < h ? b + parseInt(step * ((h-b)/count || 1)) : h; var rr = r < w ? r + parseInt(step * ((w-r)/count || 1)) : w; $next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' }); (step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none'); })(); }); opts.cssBefore = { display: 'block', opacity: 1, top: 0, left: 0 }; opts.animIn = { left: 0 }; opts.animOut = { left: 0 }; }; })(jQuery); /* ------------------------------------------------------------------------ Class: prettyPhoto Use: Lightbox clone for jQuery Author: Stephane Caron (http://www.no-margin-for-errors.com) Version: 3.1.3 ------------------------------------------------------------------------- */ (function($) { $.prettyPhoto = {version: '3.1.3'}; $.fn.prettyPhoto = function(pp_settings) { pp_settings = jQuery.extend({ animation_speed: 'fast', /* fast/slow/normal */ slideshow: 5000, /* false OR interval time in ms */ autoplay_slideshow: false, /* true/false */ opacity: 0.80, /* Value between 0 and 1 */ show_title: true, /* true/false */ allow_resize: true, /* Resize the photos bigger than viewport. true/false */ default_width: 500, default_height: 344, counter_separator_label: '/', /* The separator for the gallery counter 1 "of" 2 */ theme: 'pp_default', /* light_rounded / dark_rounded / light_square / dark_square / facebook */ horizontal_padding: 20, /* The padding on each side of the picture */ hideflash: false, /* Hides all the flash object on a page, set to TRUE if flash appears over prettyPhoto */ wmode: 'opaque', /* Set the flash wmode attribute */ autoplay: true, /* Automatically start videos: True/False */ modal: false, /* If set to true, only the close button will close the window */ deeplinking: true, /* Allow prettyPhoto to update the url to enable deeplinking. */ overlay_gallery: true, /* If set to true, a gallery will overlay the fullscreen image on mouse over */ keyboard_shortcuts: true, /* Set to false if you open forms inside prettyPhoto */ changepicturecallback: function(){}, /* Called everytime an item is shown/changed */ callback: function(){}, /* Called when prettyPhoto is closed */ ie6_fallback: true, markup: '
    \
     
    \
    \
    \
    \
    \
    \
    \
    \
    \
    \
    \
    \ Expand \
    \ next \ previous \
    \
    \
    \
    \ Previous \

    0/0

    \ Next \
    \

    \
    {pp_social}
    \ Close \
    \
    \
    \
    \
    \
    \
    \
    \
    \
    \
    \
    \
    ', gallery_markup: '', image_markup: '', flash_markup: '', quicktime_markup: '', iframe_markup: '', inline_markup: '
    {content}
    ', custom_markup: '', social_tools: '' /* html or false to disable */ }, pp_settings); // Global variables accessible only by prettyPhoto var matchedObjects = this, percentBased = false, pp_dimensions, pp_open, // prettyPhoto container specific pp_contentHeight, pp_contentWidth, pp_containerHeight, pp_containerWidth, // Window size windowHeight = $(window).height(), windowWidth = $(window).width(), // Global elements pp_slideshow; doresize = true, scroll_pos = _get_scroll(); // Window/Keyboard events $(window).unbind('resize.prettyphoto').bind('resize.prettyphoto',function(){ _center_overlay(); _resize_overlay(); }); if(pp_settings.keyboard_shortcuts) { $(document).unbind('keydown.prettyphoto').bind('keydown.prettyphoto',function(e){ if(typeof $pp_pic_holder != 'undefined'){ if($pp_pic_holder.is(':visible')){ switch(e.keyCode){ case 37: $.prettyPhoto.changePage('previous'); e.preventDefault(); break; case 39: $.prettyPhoto.changePage('next'); e.preventDefault(); break; case 27: if(!settings.modal) $.prettyPhoto.close(); e.preventDefault(); break; }; // return false; }; }; }); }; /** * Initialize prettyPhoto. */ $.prettyPhoto.initialize = function() { settings = pp_settings; if(settings.theme == 'pp_default') settings.horizontal_padding = 16; if(settings.ie6_fallback && $.browser.msie && parseInt($.browser.version) == 6) settings.theme = "light_square"; // Fallback to a supported theme for IE6 // Find out if the picture is part of a set theRel = $(this).attr('rel'); galleryRegExp = /\[(?:.*)\]/; isSet = (galleryRegExp.exec(theRel)) ? true : false; // Put the SRCs, TITLEs, ALTs into an array. pp_images = (isSet) ? jQuery.map(matchedObjects, function(n, i){ if($(n).attr('rel').indexOf(theRel) != -1) return $(n).attr('href'); }) : $.makeArray($(this).attr('href')); pp_titles = (isSet) ? jQuery.map(matchedObjects, function(n, i){ if($(n).attr('rel').indexOf(theRel) != -1) return ($(n).find('img').attr('alt')) ? $(n).find('img').attr('alt') : ""; }) : $.makeArray($(this).find('img').attr('alt')); pp_descriptions = (isSet) ? jQuery.map(matchedObjects, function(n, i){ if($(n).attr('rel').indexOf(theRel) != -1) return ($(n).attr('title')) ? $(n).attr('title') : ""; }) : $.makeArray($(this).attr('title')); if(pp_images.length > 30) settings.overlay_gallery = false; set_position = jQuery.inArray($(this).attr('href'), pp_images); // Define where in the array the clicked item is positionned rel_index = (isSet) ? set_position : $("a[rel^='"+theRel+"']").index($(this)); _build_overlay(this); // Build the overlay {this} being the caller if(settings.allow_resize) $(window).bind('scroll.prettyphoto',function(){ _center_overlay(); }); $.prettyPhoto.open(); return false; } /** * Opens the prettyPhoto modal box. * @param image {String,Array} Full path to the image to be open, can also be an array containing full images paths. * @param title {String,Array} The title to be displayed with the picture, can also be an array containing all the titles. * @param description {String,Array} The description to be displayed with the picture, can also be an array containing all the descriptions. */ $.prettyPhoto.open = function(event) { if(typeof settings == "undefined"){ // Means it's an API call, need to manually get the settings and set the variables settings = pp_settings; if($.browser.msie && $.browser.version == 6) settings.theme = "light_square"; // Fallback to a supported theme for IE6 pp_images = $.makeArray(arguments[0]); pp_titles = (arguments[1]) ? $.makeArray(arguments[1]) : $.makeArray(""); pp_descriptions = (arguments[2]) ? $.makeArray(arguments[2]) : $.makeArray(""); isSet = (pp_images.length > 1) ? true : false; set_position = 0; _build_overlay(event.target); // Build the overlay {this} being the caller } if($.browser.msie && $.browser.version == 6) $('select').css('visibility','hidden'); // To fix the bug with IE select boxes if(settings.hideflash) $('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility','hidden'); // Hide the flash _checkPosition($(pp_images).size()); // Hide the next/previous links if on first or last images. $('.pp_loaderIcon').show(); if(settings.deeplinking) setHashtag(); // Rebuild Facebook Like Button with updated href if(settings.social_tools){ facebook_like_link = settings.social_tools.replace('{location_href}', encodeURIComponent(location.href)); $pp_pic_holder.find('.pp_social').html(facebook_like_link); } // Fade the content in if($ppt.is(':hidden')) $ppt.css('opacity',0).show(); $pp_overlay.show().fadeTo(settings.animation_speed,settings.opacity); // Display the current position $pp_pic_holder.find('.currentTextHolder').text((set_position+1) + settings.counter_separator_label + $(pp_images).size()); // Set the description if(pp_descriptions[set_position] != ""){ $pp_pic_holder.find('.pp_description').show().html(unescape(pp_descriptions[set_position])); }else{ $pp_pic_holder.find('.pp_description').hide(); } // Get the dimensions movie_width = ( parseFloat(getParam('width',pp_images[set_position])) ) ? getParam('width',pp_images[set_position]) : settings.default_width.toString(); movie_height = ( parseFloat(getParam('height',pp_images[set_position])) ) ? getParam('height',pp_images[set_position]) : settings.default_height.toString(); // If the size is % based, calculate according to window dimensions percentBased=false; if(movie_height.indexOf('%') != -1) { movie_height = parseFloat(($(window).height() * parseFloat(movie_height) / 100) - 150); percentBased = true; } if(movie_width.indexOf('%') != -1) { movie_width = parseFloat(($(window).width() * parseFloat(movie_width) / 100) - 150); percentBased = true; } // Fade the holder $pp_pic_holder.fadeIn(function(){ // Set the title (settings.show_title && pp_titles[set_position] != "" && typeof pp_titles[set_position] != "undefined") ? $ppt.html(unescape(pp_titles[set_position])) : $ppt.html(' '); imgPreloader = ""; skipInjection = false; // Inject the proper content switch(_getFileType(pp_images[set_position])){ case 'image': imgPreloader = new Image(); // Preload the neighbour images nextImage = new Image(); if(isSet && set_position < $(pp_images).size() -1) nextImage.src = pp_images[set_position + 1]; prevImage = new Image(); if(isSet && pp_images[set_position - 1]) prevImage.src = pp_images[set_position - 1]; $pp_pic_holder.find('#pp_full_res')[0].innerHTML = settings.image_markup.replace(/{path}/g,pp_images[set_position]); imgPreloader.onload = function(){ // Fit item to viewport pp_dimensions = _fitToViewport(imgPreloader.width,imgPreloader.height); _showContent(); }; imgPreloader.onerror = function(){ alert('Image cannot be loaded. Make sure the path is correct and image exist.'); $.prettyPhoto.close(); }; imgPreloader.src = pp_images[set_position]; break; case 'youtube': pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport // Regular youtube link movie_id = getParam('v',pp_images[set_position]); // youtu.be link if(movie_id == ""){ movie_id = pp_images[set_position].split('youtu.be/'); movie_id = movie_id[1]; if(movie_id.indexOf('?') > 0) movie_id = movie_id.substr(0,movie_id.indexOf('?')); // Strip anything after the ? if(movie_id.indexOf('&') > 0) movie_id = movie_id.substr(0,movie_id.indexOf('&')); // Strip anything after the & } movie = 'http://www.youtube.com/embed/'+movie_id; (getParam('rel',pp_images[set_position])) ? movie+="?rel="+getParam('rel',pp_images[set_position]) : movie+="?rel=1"; if(settings.autoplay) movie += "&autoplay=1"; toInject = settings.iframe_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,movie); break; case 'vimeo': pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport movie_id = pp_images[set_position]; var regExp = /http:\/\/(www\.)?vimeo.com\/(\d+)/; var match = movie_id.match(regExp); movie = 'http://player.vimeo.com/video/'+ match[2] +'?title=0&byline=0&portrait=0'; if(settings.autoplay) movie += "&autoplay=1;"; vimeo_width = pp_dimensions['width'] + '/embed/?moog_width='+ pp_dimensions['width']; toInject = settings.iframe_markup.replace(/{width}/g,vimeo_width).replace(/{height}/g,pp_dimensions['height']).replace(/{path}/g,movie); break; case 'quicktime': pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport pp_dimensions['height']+=15; pp_dimensions['contentHeight']+=15; pp_dimensions['containerHeight']+=15; // Add space for the control bar toInject = settings.quicktime_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,pp_images[set_position]).replace(/{autoplay}/g,settings.autoplay); break; case 'flash': pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport flash_vars = pp_images[set_position]; flash_vars = flash_vars.substring(pp_images[set_position].indexOf('flashvars') + 10,pp_images[set_position].length); filename = pp_images[set_position]; filename = filename.substring(0,filename.indexOf('?')); toInject = settings.flash_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,filename+'?'+flash_vars); break; case 'iframe': pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport frame_url = pp_images[set_position]; frame_url = frame_url.substr(0,frame_url.indexOf('iframe')-1); toInject = settings.iframe_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{path}/g,frame_url); break; case 'ajax': doresize = false; // Make sure the dimensions are not resized. pp_dimensions = _fitToViewport(movie_width,movie_height); doresize = true; // Reset the dimensions skipInjection = true; $.get(pp_images[set_position],function(responseHTML){ toInject = settings.inline_markup.replace(/{content}/g,responseHTML); $pp_pic_holder.find('#pp_full_res')[0].innerHTML = toInject; _showContent(); }); break; case 'custom': pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport toInject = settings.custom_markup; break; case 'inline': // to get the item height clone it, apply default width, wrap it in the prettyPhoto containers , then delete myClone = $(pp_images[set_position]).clone().append('
    ').css({'width':settings.default_width}).wrapInner('
    ').appendTo($('body')).show(); doresize = false; // Make sure the dimensions are not resized. pp_dimensions = _fitToViewport($(myClone).width(),$(myClone).height()); doresize = true; // Reset the dimensions $(myClone).remove(); toInject = settings.inline_markup.replace(/{content}/g,$(pp_images[set_position]).html()); break; }; if(!imgPreloader && !skipInjection){ $pp_pic_holder.find('#pp_full_res')[0].innerHTML = toInject; // Show content _showContent(); }; }); return false; }; /** * Change page in the prettyPhoto modal box * @param direction {String} Direction of the paging, previous or next. */ $.prettyPhoto.changePage = function(direction){ currentGalleryPage = 0; if(direction == 'previous') { set_position--; if (set_position < 0) set_position = $(pp_images).size()-1; }else if(direction == 'next'){ set_position++; if(set_position > $(pp_images).size()-1) set_position = 0; }else{ set_position=direction; }; rel_index = set_position; if(!doresize) doresize = true; // Allow the resizing of the images $('.pp_contract').removeClass('pp_contract').addClass('pp_expand'); _hideContent(function(){ $.prettyPhoto.open(); }); }; /** * Change gallery page in the prettyPhoto modal box * @param direction {String} Direction of the paging, previous or next. */ $.prettyPhoto.changeGalleryPage = function(direction){ if(direction=='next'){ currentGalleryPage ++; if(currentGalleryPage > totalPage) currentGalleryPage = 0; }else if(direction=='previous'){ currentGalleryPage --; if(currentGalleryPage < 0) currentGalleryPage = totalPage; }else{ currentGalleryPage = direction; }; slide_speed = (direction == 'next' || direction == 'previous') ? settings.animation_speed : 0; slide_to = currentGalleryPage * (itemsPerPage * itemWidth); $pp_gallery.find('ul').animate({left:-slide_to},slide_speed); }; /** * Start the slideshow... */ $.prettyPhoto.startSlideshow = function(){ if(typeof pp_slideshow == 'undefined'){ $pp_pic_holder.find('.pp_play').unbind('click').removeClass('pp_play').addClass('pp_pause').click(function(){ $.prettyPhoto.stopSlideshow(); return false; }); pp_slideshow = setInterval($.prettyPhoto.startSlideshow,settings.slideshow); }else{ $.prettyPhoto.changePage('next'); }; } /** * Stop the slideshow... */ $.prettyPhoto.stopSlideshow = function(){ $pp_pic_holder.find('.pp_pause').unbind('click').removeClass('pp_pause').addClass('pp_play').click(function(){ $.prettyPhoto.startSlideshow(); return false; }); clearInterval(pp_slideshow); pp_slideshow=undefined; } /** * Closes prettyPhoto. */ $.prettyPhoto.close = function(){ if($pp_overlay.is(":animated")) return; $.prettyPhoto.stopSlideshow(); $pp_pic_holder.stop().find('object,embed').css('visibility','hidden'); $('div.pp_pic_holder,div.ppt,.pp_fade').fadeOut(settings.animation_speed,function(){ $(this).remove(); }); $pp_overlay.fadeOut(settings.animation_speed, function(){ if($.browser.msie && $.browser.version == 6) $('select').css('visibility','visible'); // To fix the bug with IE select boxes if(settings.hideflash) $('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility','visible'); // Show the flash $(this).remove(); // No more need for the prettyPhoto markup $(window).unbind('scroll.prettyphoto'); clearHashtag(); settings.callback(); doresize = true; pp_open = false; delete settings; }); }; /** * Set the proper sizes on the containers and animate the content in. */ function _showContent(){ $('.pp_loaderIcon').hide(); // Calculate the opened top position of the pic holder projectedTop = scroll_pos['scrollTop'] + ((windowHeight/2) - (pp_dimensions['containerHeight']/2)); if(projectedTop < 0) projectedTop = 0; $ppt.fadeTo(settings.animation_speed,1); // Resize the content holder $pp_pic_holder.find('.pp_content') .animate({ height:pp_dimensions['contentHeight'], width:pp_dimensions['contentWidth'] },settings.animation_speed); // Resize picture the holder $pp_pic_holder.animate({ 'top': projectedTop, 'left': (windowWidth/2) - (pp_dimensions['containerWidth']/2), width:pp_dimensions['containerWidth'] },settings.animation_speed,function(){ $pp_pic_holder.find('.pp_hoverContainer,#fullResImage').height(pp_dimensions['height']).width(pp_dimensions['width']); $pp_pic_holder.find('.pp_fade').fadeIn(settings.animation_speed); // Fade the new content // Show the nav if(isSet && _getFileType(pp_images[set_position])=="image") { $pp_pic_holder.find('.pp_hoverContainer').show(); }else{ $pp_pic_holder.find('.pp_hoverContainer').hide(); } if(pp_dimensions['resized']){ // Fade the resizing link if the image is resized $('a.pp_expand,a.pp_contract').show(); }else{ $('a.pp_expand').hide(); } if(settings.autoplay_slideshow && !pp_slideshow && !pp_open) $.prettyPhoto.startSlideshow(); settings.changepicturecallback(); // Callback! pp_open = true; }); _insert_gallery(); }; /** * Hide the content...DUH! */ function _hideContent(callback){ // Fade out the current picture $pp_pic_holder.find('#pp_full_res object,#pp_full_res embed').css('visibility','hidden'); $pp_pic_holder.find('.pp_fade').fadeOut(settings.animation_speed,function(){ $('.pp_loaderIcon').show(); callback(); }); }; /** * Check the item position in the gallery array, hide or show the navigation links * @param setCount {integer} The total number of items in the set */ function _checkPosition(setCount){ (setCount > 1) ? $('.pp_nav').show() : $('.pp_nav').hide(); // Hide the bottom nav if it's not a set. }; /** * Resize the item dimensions if it's bigger than the viewport * @param width {integer} Width of the item to be opened * @param height {integer} Height of the item to be opened * @return An array containin the "fitted" dimensions */ function _fitToViewport(width,height){ resized = false; _getDimensions(width,height); // Define them in case there's no resize needed imageWidth = width, imageHeight = height; if( ((pp_containerWidth > windowWidth) || (pp_containerHeight > windowHeight)) && doresize && settings.allow_resize && !percentBased) { resized = true, fitting = false; while (!fitting){ if((pp_containerWidth > windowWidth)){ imageWidth = (windowWidth - 200); imageHeight = (height/width) * imageWidth; }else if((pp_containerHeight > windowHeight)){ imageHeight = (windowHeight - 200); imageWidth = (width/height) * imageHeight; }else{ fitting = true; }; pp_containerHeight = imageHeight, pp_containerWidth = imageWidth; }; _getDimensions(imageWidth,imageHeight); if((pp_containerWidth > windowWidth) || (pp_containerHeight > windowHeight)){ _fitToViewport(pp_containerWidth,pp_containerHeight) }; }; return { width:Math.floor(imageWidth), height:Math.floor(imageHeight), containerHeight:Math.floor(pp_containerHeight), containerWidth:Math.floor(pp_containerWidth) + (settings.horizontal_padding * 2), contentHeight:Math.floor(pp_contentHeight), contentWidth:Math.floor(pp_contentWidth), resized:resized }; }; /** * Get the containers dimensions according to the item size * @param width {integer} Width of the item to be opened * @param height {integer} Height of the item to be opened */ function _getDimensions(width,height){ width = parseFloat(width); height = parseFloat(height); // Get the details height, to do so, I need to clone it since it's invisible $pp_details = $pp_pic_holder.find('.pp_details'); $pp_details.width(width); detailsHeight = parseFloat($pp_details.css('marginTop')) + parseFloat($pp_details.css('marginBottom')); $pp_details = $pp_details.clone().addClass(settings.theme).width(width).appendTo($('body')).css({ 'position':'absolute', 'top':-10000 }); detailsHeight += $pp_details.height(); detailsHeight = (detailsHeight <= 34) ? 36 : detailsHeight; // Min-height for the details if($.browser.msie && $.browser.version==7) detailsHeight+=8; $pp_details.remove(); // Get the titles height, to do so, I need to clone it since it's invisible $pp_title = $pp_pic_holder.find('.ppt'); $pp_title.width(width); titleHeight = parseFloat($pp_title.css('marginTop')) + parseFloat($pp_title.css('marginBottom')); $pp_title = $pp_title.clone().appendTo($('body')).css({ 'position':'absolute', 'top':-10000 }); titleHeight += $pp_title.height(); $pp_title.remove(); // Get the container size, to resize the holder to the right dimensions pp_contentHeight = height + detailsHeight; pp_contentWidth = width; pp_containerHeight = pp_contentHeight + titleHeight + $pp_pic_holder.find('.pp_top').height() + $pp_pic_holder.find('.pp_bottom').height(); pp_containerWidth = width; } function _getFileType(itemSrc){ if (itemSrc.match(/youtube\.com\/watch/i) || itemSrc.match(/youtu\.be/i)) { return 'youtube'; }else if (itemSrc.match(/vimeo\.com/i)) { return 'vimeo'; }else if(itemSrc.match(/\b.mov\b/i)){ return 'quicktime'; }else if(itemSrc.match(/\b.swf\b/i)){ return 'flash'; }else if(itemSrc.match(/\biframe=true\b/i)){ return 'iframe'; }else if(itemSrc.match(/\bajax=true\b/i)){ return 'ajax'; }else if(itemSrc.match(/\bcustom=true\b/i)){ return 'custom'; }else if(itemSrc.substr(0,1) == '#'){ return 'inline'; }else{ return 'image'; }; }; function _center_overlay(){ if(doresize && typeof $pp_pic_holder != 'undefined') { scroll_pos = _get_scroll(); contentHeight = $pp_pic_holder.height(), contentwidth = $pp_pic_holder.width(); projectedTop = (windowHeight/2) + scroll_pos['scrollTop'] - (contentHeight/2); if(projectedTop < 0) projectedTop = 0; if(contentHeight > windowHeight) return; $pp_pic_holder.css({ 'top': projectedTop, 'left': (windowWidth/2) + scroll_pos['scrollLeft'] - (contentwidth/2) }); }; }; function _get_scroll(){ if (self.pageYOffset) { return {scrollTop:self.pageYOffset,scrollLeft:self.pageXOffset}; } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict return {scrollTop:document.documentElement.scrollTop,scrollLeft:document.documentElement.scrollLeft}; } else if (document.body) {// all other Explorers return {scrollTop:document.body.scrollTop,scrollLeft:document.body.scrollLeft}; }; }; function _resize_overlay() { windowHeight = $(window).height(), windowWidth = $(window).width(); if(typeof $pp_overlay != "undefined") $pp_overlay.height($(document).height()).width(windowWidth); }; function _insert_gallery(){ if(isSet && settings.overlay_gallery && _getFileType(pp_images[set_position])=="image" && (settings.ie6_fallback && !($.browser.msie && parseInt($.browser.version) == 6))) { itemWidth = 52+5; // 52 beign the thumb width, 5 being the right margin. navWidth = (settings.theme == "facebook" || settings.theme == "pp_default") ? 50 : 30; // Define the arrow width depending on the theme itemsPerPage = Math.floor((pp_dimensions['containerWidth'] - 100 - navWidth) / itemWidth); itemsPerPage = (itemsPerPage < pp_images.length) ? itemsPerPage : pp_images.length; totalPage = Math.ceil(pp_images.length / itemsPerPage) - 1; // Hide the nav in the case there's no need for links if(totalPage == 0){ navWidth = 0; // No nav means no width! $pp_gallery.find('.pp_arrow_next,.pp_arrow_previous').hide(); }else{ $pp_gallery.find('.pp_arrow_next,.pp_arrow_previous').show(); }; galleryWidth = itemsPerPage * itemWidth; fullGalleryWidth = pp_images.length * itemWidth; // Set the proper width to the gallery items $pp_gallery .css('margin-left',-((galleryWidth/2) + (navWidth/2))) .find('div:first').width(galleryWidth+5) .find('ul').width(fullGalleryWidth) .find('li.selected').removeClass('selected'); goToPage = (Math.floor(set_position/itemsPerPage) < totalPage) ? Math.floor(set_position/itemsPerPage) : totalPage; $.prettyPhoto.changeGalleryPage(goToPage); $pp_gallery_li.filter(':eq('+set_position+')').addClass('selected'); }else{ $pp_pic_holder.find('.pp_content').unbind('mouseenter mouseleave'); // $pp_gallery.hide(); } } function _build_overlay(caller){ // Inject Social Tool markup into General markup if(settings.social_tools) facebook_like_link = settings.social_tools.replace('{location_href}', encodeURIComponent(location.href)); settings.markup=settings.markup.replace('{pp_social}',(settings.social_tools)?facebook_like_link:''); $('body').append(settings.markup); // Inject the markup $pp_pic_holder = $('.pp_pic_holder') , $ppt = $('.ppt'), $pp_overlay = $('div.pp_overlay'); // Set my global selectors // Inject the inline gallery! if(isSet && settings.overlay_gallery) { currentGalleryPage = 0; toInject = ""; for (var i=0; i < pp_images.length; i++) { if(!pp_images[i].match(/\b(jpg|jpeg|png|gif)\b/gi)){ classname = 'default'; img_src = ''; }else{ classname = ''; img_src = pp_images[i]; } toInject += "
  • "; }; toInject = settings.gallery_markup.replace(/{gallery}/g,toInject); $pp_pic_holder.find('#pp_full_res').after(toInject); $pp_gallery = $('.pp_pic_holder .pp_gallery'), $pp_gallery_li = $pp_gallery.find('li'); // Set the gallery selectors $pp_gallery.find('.pp_arrow_next').click(function(){ $.prettyPhoto.changeGalleryPage('next'); $.prettyPhoto.stopSlideshow(); return false; }); $pp_gallery.find('.pp_arrow_previous').click(function(){ $.prettyPhoto.changeGalleryPage('previous'); $.prettyPhoto.stopSlideshow(); return false; }); $pp_pic_holder.find('.pp_content').hover( function(){ $pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeIn(); }, function(){ $pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeOut(); }); itemWidth = 52+5; // 52 beign the thumb width, 5 being the right margin. $pp_gallery_li.each(function(i){ $(this) .find('a') .click(function(){ $.prettyPhoto.changePage(i); $.prettyPhoto.stopSlideshow(); return false; }); }); }; // Inject the play/pause if it's a slideshow if(settings.slideshow){ $pp_pic_holder.find('.pp_nav').prepend('Play') $pp_pic_holder.find('.pp_nav .pp_play').click(function(){ $.prettyPhoto.startSlideshow(); return false; }); } $pp_pic_holder.attr('class','pp_pic_holder ' + settings.theme); // Set the proper theme $pp_overlay .css({ 'opacity':0, 'height':$(document).height(), 'width':$(window).width() }) .bind('click',function(){ if(!settings.modal) $.prettyPhoto.close(); }); $('a.pp_close').bind('click',function(){ $.prettyPhoto.close(); return false; }); $('a.pp_expand').bind('click',function(e){ // Expand the image if($(this).hasClass('pp_expand')){ $(this).removeClass('pp_expand').addClass('pp_contract'); doresize = false; }else{ $(this).removeClass('pp_contract').addClass('pp_expand'); doresize = true; }; _hideContent(function(){ $.prettyPhoto.open(); }); return false; }); $pp_pic_holder.find('.pp_previous, .pp_nav .pp_arrow_previous').bind('click',function(){ $.prettyPhoto.changePage('previous'); $.prettyPhoto.stopSlideshow(); return false; }); $pp_pic_holder.find('.pp_next, .pp_nav .pp_arrow_next').bind('click',function(){ $.prettyPhoto.changePage('next'); $.prettyPhoto.stopSlideshow(); return false; }); _center_overlay(); // Center it }; if(!pp_alreadyInitialized && getHashtag()){ pp_alreadyInitialized = true; // Grab the rel index to trigger the click on the correct element hashIndex = getHashtag(); hashRel = hashIndex; hashIndex = hashIndex.substring(hashIndex.indexOf('/')+1,hashIndex.length-1); hashRel = hashRel.substring(0,hashRel.indexOf('/')); // Little timeout to make sure all the prettyPhoto initialize scripts has been run. // Useful in the event the page contain several init scripts. setTimeout(function(){ $("a[rel^='"+hashRel+"']:eq("+hashIndex+")").trigger('click'); },50); } return this.unbind('click.prettyphoto').bind('click.prettyphoto',$.prettyPhoto.initialize); // Return the jQuery object for chaining. The unbind method is used to avoid click conflict when the plugin is called more than once }; function getHashtag(){ url = location.href; hashtag = (url.indexOf('#!') != -1) ? decodeURI(url.substring(url.indexOf('#!')+2,url.length)) : false; return hashtag; }; function setHashtag(){ if(typeof theRel == 'undefined') return; // theRel is set on normal calls, it's impossible to deeplink using the API location.hash = '!' + theRel + '/'+rel_index+'/'; }; function clearHashtag(){ // Clear the hashtag only if it was set by prettyPhoto url = location.href; hashtag = (url.indexOf('#!prettyPhoto')) ? true : false; if(hashtag) location.hash = "!prettyPhoto"; } function getParam(name,url){ name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); var regexS = "[\\?&]"+name+"=([^&#]*)"; var regex = new RegExp( regexS ); var results = regex.exec( url ); return ( results == null ) ? "" : results[1]; } })(jQuery); var pp_alreadyInitialized = false; // Used for the deep linking to make sure not to call the same function several times.