(function(window,$,undefined){var can=window.can||{};if(typeof GLOBALCAN==='undefined'||GLOBALCAN!==false){window.can=can;} can.isDeferred=function(obj){var isFunction=this.isFunction;return obj&&isFunction(obj.then)&&isFunction(obj.pipe);};can.each=function(elements,callback,context){var i=0,key;if(elements){if(typeof elements.length==='number'&&elements.pop){if(elements.attr){elements.attr('length');} for(key=elements.length;i/g,'>').replace(quote,'"').replace(singleQuote,"'");},getObject:function(name,roots,add){var parts=name?name.split('.'):[],length=parts.length,current,r=0,ret,i;roots=can.isArray(roots)?roots:[roots||window];if(!length){return roots[0];} while(roots[r]){current=roots[r];for(i=0;i=this.length){this.length=(+attr+1)}},serialize:function(){return serialize(this,'serialize',[]);},splice:function(index,howMany){var args=can.makeArray(arguments),i;for(i=2;i0){Observe.triggerBatch(this,"change",[""+index,"remove",undefined,removed]);unhookup(removed,this._cid);} if(args.length>2){Observe.triggerBatch(this,"change",[""+index,"add",args.slice(2),removed]);} return removed;},_attrs:function(items,remove){if(items===undefined){return serialize(this,'attr',[]);} items=can.makeArray(items);Observe.startBatch();this._updateAttrs(items,remove);Observe.stopBatch()},_updateAttrs:function(items,remove){var len=Math.min(items.length,this.length);for(var prop=0;propthis.length){this.push.apply(this,items.slice(this.length));}else if(items.length0){res.splice(0);} can.each(raw,function(rawPart){tmp.push(self.model(rawPart));});res.push.apply(res,tmp);if(!arr){can.each(instancesRawData,function(val,prop){if(prop!=='data'){res.attr(prop,val);}})} return res;},model:function(attributes){if(!attributes){return;} if(attributes instanceof this){attributes=attributes.serialize();} var id=attributes[this.id],model=id&&this.store[id]?this.store[id].attr(attributes):new this(attributes);if(this._reqs){this.store[attributes[this.id]]=model;} return model;}},{isNew:function(){var id=getId(this);return!(id||id===0);},save:function(success,error){return makeRequest(this,this.isNew()?'create':'update',success,error);},destroy:function(success,error){return makeRequest(this,'destroy',success,error,'destroyed');},bind:function(eventName){if(!ignoreHookup.test(eventName)){if(!this._bindings){this.constructor.store[getId(this)]=this;this._bindings=0;} this._bindings++;} return can.Observe.prototype.bind.apply(this,arguments);},unbind:function(eventName){if(!ignoreHookup.test(eventName)){this._bindings--;if(!this._bindings){delete this.constructor.store[getId(this)];}} return can.Observe.prototype.unbind.apply(this,arguments);},___set:function(prop,val){can.Observe.prototype.___set.call(this,prop,val) if(prop===this.constructor.id&&this._bindings){this.constructor.store[getId(this)]=this;}}});can.each({makeFindAll:"models",makeFindOne:"model"},function(method,name){can.Model[name]=function(oldFind){return function(params,success,error){var def=pipe(oldFind.call(this,params),this,method);def.then(success,error);return def;};};});can.each(["created","updated","destroyed"],function(funcName){can.Model.prototype[funcName]=function(attrs){var stub,constructor=this.constructor;stub=attrs&&typeof attrs=='object'&&this.attr(attrs.attr?attrs.attr():attrs);can.trigger(this,funcName);can.trigger(this,"change",funcName) can.trigger(constructor,funcName,this);};});var ML=can.Model.List=can.Observe.List({setup:function(){can.Observe.List.prototype.setup.apply(this,arguments);var self=this;this.bind('change',function(ev,how){if(/\w+\.destroyed/.test(how)){var index=self.indexOf(ev.target);if(index!=-1){self.splice(index,1);}}})}}) var digitTest=/^\d+$/,keyBreaker=/([^\[\]]+)|(\[\])/g,paramTest=/([^?#]*)(#.*)?$/,prep=function(str){return decodeURIComponent(str.replace(/\+/g," "));};can.extend(can,{deparam:function(params){var data={},pairs,lastPart;if(params&¶mTest.test(params)){pairs=params.split('&'),can.each(pairs,function(pair){var parts=pair.split('='),key=prep(parts.shift()),value=prep(parts.join("=")),current=data;parts=key.match(keyBreaker);for(var j=0,l=parts.length-1;jmatches){route=temp;matches=matchCount;} if(matchCount>=propCount){return false;}});if(can.route.routes[routeName]&&matchesData(can.route.routes[routeName],data)===matches){route=can.route.routes[routeName];} if(route){var cpy=extend({},data),res=route.route.replace(matcher,function(whole,name){delete cpy[name];return data[name]===route.defaults[name]?"":encodeURIComponent(data[name]);}),after;each(route.defaults,function(val,name){if(cpy[name]===val){delete cpy[name];}});after=can.param(cpy);if(_setRoute){can.route.attr('route',route.route);} return res+(after?can.route._querySeparator+after:"");} return can.isEmptyObject(data)?"":can.route._querySeparator+can.param(data);},deparam:function(url){var route={length:-1};each(can.route.routes,function(temp,name){if(temp.test.test(url)&&temp.length>route.length){route=temp;}});if(route.length>-1){var parts=url.match(route.test),start=parts.shift(),remainder=url.substr(start.length-(parts[parts.length-1]===can.route._querySeparator?1:0)),obj=(remainder&&can.route._paramsMatcher.test(remainder))?can.deparam(remainder.slice(1)):{};obj=extend(true,{},route.defaults,obj);each(parts,function(part,i){if(part&&part!==can.route._querySeparator){obj[route.names[i]]=decodeURIComponent(part);}});obj.route=route.route;return obj;} if(url.charAt(0)!==can.route._querySeparator){url=can.route._querySeparator+url;} return can.route._paramsMatcher.test(url)?can.deparam(url.slice(1)):{};},data:new can.Observe({}),routes:{},ready:function(val){if(val===false){onready=val;} if(val===true||onready===true){can.route._setup();setState();} return can.route;},url:function(options,merge){if(merge){options=extend({},curParams,options)} return"#!"+can.route.param(options);},link:function(name,options,props,merge){return""+name+"";},current:function(options){return location.hash=="#!"+can.route.param(options)},_setup:function(){can.bind.call(window,'hashchange',setState);},_getHash:function(){return location.href.split(/#!?/)[1]||"";},_setHash:function(serialized){var path=(can.route.param(serialized,true));location.hash="#!"+path;return path;}});each(['bind','unbind','delegate','undelegate','attr','removeAttr'],function(name){can.route[name]=function(){return can.route.data[name].apply(can.route.data,arguments)}}) var timer,curParams,setState=can.route.setState=function(){var hash=can.route._getHash();curParams=can.route.deparam(hash);if(!changingData||hash!==lastHash){can.route.attr(curParams,true);}},lastHash,changingData;can.route.bind("change",function(ev,attr){changingData=1;clearTimeout(timer);timer=setTimeout(function(){changingData=0;var serialized=can.route.data.serialize();lastHash=can.route._setHash(serialized);},1);});can.bind.call(document,"ready",can.route.ready);can.route.constructor.canMakeObserve=can.Observe.canMakeObserve;var bind=function(el,ev,callback){can.bind.call(el,ev,callback);return function(){can.unbind.call(el,ev,callback);};},isFunction=can.isFunction,extend=can.extend,each=can.each,slice=[].slice,paramReplacer=/\{([^\}]+)\}/g,special=can.getObject("$.event.special")||{},delegate=function(el,selector,ev,callback){can.delegate.call(el,selector,ev,callback);return function(){can.undelegate.call(el,selector,ev,callback);};},binder=function(el,ev,callback,selector){return selector?delegate(el,can.trim(selector),ev,callback):bind(el,ev,callback);},basicProcessor;var Control=can.Control=can.Construct({setup:function(){can.Construct.setup.apply(this,arguments);if(can.Control){var control=this,funcName;control.actions={};for(funcName in control.prototype){if(control._isAction(funcName)){control.actions[funcName]=control._action(funcName);}}}},_shifter:function(context,name){var method=typeof name=="string"?context[name]:name;if(!isFunction(method)){method=context[method];} return function(){context.called=name;return method.apply(context,[this.nodeName?can.$(this):this].concat(slice.call(arguments,0)));};},_isAction:function(methodName){var val=this.prototype[methodName],type=typeof val;return(methodName!=='constructor')&&(type=="function"||(type=="string"&&isFunction(this.prototype[val])))&&!!(special[methodName]||processors[methodName]||/[^\w]/.test(methodName));},_action:function(methodName,options){paramReplacer.lastIndex=0;if(options||!paramReplacer.test(methodName)){var convertedName=options?can.sub(methodName,[options,window]):methodName;if(!convertedName){return null;} var arr=can.isArray(convertedName),name=arr?convertedName[1]:convertedName,parts=name.split(/\s+/g),event=parts.pop();return{processor:processors[event]||basicProcessor,parts:[name,parts.join(" "),event],delegate:arr?convertedName[0]:undefined};}},processors:{},defaults:{}},{setup:function(element,options){var cls=this.constructor,pluginname=cls.pluginName||cls._fullName,arr;this.element=can.$(element) if(pluginname&&pluginname!=='can_control'){this.element.addClass(pluginname);} (arr=can.data(this.element,"controls"))||can.data(this.element,"controls",arr=[]);arr.push(this);this.options=extend({},cls.defaults,options);this.on();return[this.element,this.options];},on:function(el,selector,eventName,func){if(!el){this.off();var cls=this.constructor,bindings=this._bindings,actions=cls.actions,element=this.element,destroyCB=can.Control._shifter(this,"destroy"),funcName,ready;for(funcName in actions){if(actions.hasOwnProperty(funcName)&&(ready=actions[funcName]||cls._action(funcName,this.options))){bindings.push(ready.processor(ready.delegate||element,ready.parts[2],ready.parts[1],funcName,this));}} can.bind.call(element,"destroyed",destroyCB);bindings.push(function(el){can.unbind.call(el,"destroyed",destroyCB);});return bindings.length;} if(typeof el=='string'){func=eventName;eventName=selector;selector=el;el=this.element;} if(func===undefined){func=eventName;eventName=selector;selector=null;} if(typeof func=='string'){func=can.Control._shifter(this,func);} this._bindings.push(binder(el,eventName,func,selector));return this._bindings.length;},off:function(){var el=this.element[0] each(this._bindings||[],function(value){value(el);});this._bindings=[];},destroy:function(){var Class=this.constructor,pluginName=Class.pluginName||Class._fullName,controls;this.off();if(pluginName&&pluginName!=='can_control'){this.element.removeClass(pluginName);} controls=can.data(this.element,"controls");controls.splice(can.inArray(this,controls),1);can.trigger(this,"destroyed");this.element=null;}});var processors=can.Control.processors,basicProcessor=function(el,event,selector,methodName,control){return binder(el,event,can.Control._shifter(control,methodName),selector);};each(["change","click","contextmenu","dblclick","keydown","keyup","keypress","mousedown","mousemove","mouseout","mouseover","mouseup","reset","resize","scroll","select","submit","focusin","focusout","mouseenter","mouseleave","touchstart","touchmove","touchcancel","touchend","touchleave"],function(v){processors[v]=basicProcessor;});can.Control.processors.route=function(el,event,selector,funcName,controller){selector=selector||"";can.route(selector);var batchNum,check=function(ev,attr,how){if(can.route.attr('route')===(selector)&&(ev.batchNum===undefined||ev.batchNum!==batchNum)){batchNum=ev.batchNum;var d=can.route.attr();delete d.route;if(can.isFunction(controller[funcName])){controller[funcName](d);}else{controller[controller[funcName]](d);}}};can.route.bind('change',check);return function(){can.route.unbind('change',check);};};var isFunction=can.isFunction,makeArray=can.makeArray,hookupId=1,$view=can.view=function(view,data,helpers,callback){var result=$view.render(view,data,helpers,callback);if(isFunction(result)){return result;} if(can.isDeferred(result)){return result.pipe(function(result){return $view.frag(result);});} return $view.frag(result);};can.extend($view,{frag:function(result,parentNode){return $view.hookup($view.fragment(result),parentNode);},fragment:function(result){var frag=can.buildFragment(result,document.body);if(!frag.childNodes.length){frag.appendChild(document.createTextNode(''));} return frag;},toId:function(src){return can.map(src.toString().split(/\/|\./g),function(part){if(part){return part;}}).join("_");},hookup:function(fragment,parentNode){var hookupEls=[],id,func;can.each(fragment.childNodes?can.makeArray(fragment.childNodes):fragment,function(node){if(node.nodeType===1){hookupEls.push(node);hookupEls.push.apply(hookupEls,can.makeArray(node.getElementsByTagName('*')));}});can.each(hookupEls,function(el){if(el.getAttribute&&(id=el.getAttribute('data-view-id'))&&(func=$view.hookups[id])){func(el,parentNode,id);delete $view.hookups[id];el.removeAttribute('data-view-id');}});return fragment;},hookups:{},hook:function(cb){$view.hookups[++hookupId]=cb;return" data-view-id='"+hookupId+"'";},cached:{},cachedRenderers:{},cache:true,register:function(info){this.types["."+info.suffix]=info;},types:{},ext:".ejs",registerScript:function(){},preload:function(){},render:function(view,data,helpers,callback){if(isFunction(helpers)){callback=helpers;helpers=undefined;} var deferreds=getDeferreds(data);if(deferreds.length){var deferred=new can.Deferred();deferreds.push(get(view,true)) can.when.apply(can,deferreds).then(function(resolved){var objs=makeArray(arguments),renderer=objs.pop(),result;if(can.isDeferred(data)){data=usefulPart(resolved);} else{for(var prop in data){if(can.isDeferred(data[prop])){data[prop]=usefulPart(objs.shift());}}} result=renderer(data,helpers);deferred.resolve(result);callback&&callback(result);});return deferred;} else{var response,async=isFunction(callback),deferred=get(view,async);if(async){response=deferred;deferred.then(function(renderer){callback(data?renderer(data,helpers):renderer);})}else{if(deferred.state()==="resolved"&&deferred.__view_id){var currentRenderer=$view.cachedRenderers[deferred.__view_id];return data?currentRenderer(data,helpers):currentRenderer;}else{deferred.then(function(renderer){response=data?renderer(data,helpers):renderer;});}} return response;}},registerView:function(id,text,type,def){var func=(type||$view.types[$view.ext]).renderer(id,text);def=def||new can.Deferred();if($view.cache){$view.cached[id]=def;def.__view_id=id;$view.cachedRenderers[id]=func;} return def.resolve(func);}});var checkText=function(text,url){if(!text.length){throw"can.view: No template or empty template:"+url;}},get=function(url,async){var suffix=url.match(/\.[\w\d]+$/),type,el,id,jqXHR;if(url.match(/^#/)){url=url.substr(1);} if(el=document.getElementById(url)){suffix="."+el.type.match(/\/(x\-)?(.+)/)[2];} if(!suffix&&!$view.cached[url]){url+=(suffix=$view.ext);} if(can.isArray(suffix)){suffix=suffix[0]} id=$view.toId(url);if(url.match(/^\/\//)){var sub=url.substr(2);url=!window.steal?sub:steal.config().root.mapJoin(sub);} type=$view.types[suffix];if($view.cached[id]){return $view.cached[id];}else if(el){return $view.registerView(id,el.innerHTML,type);}else{var d=new can.Deferred();can.ajax({async:async,url:url,dataType:"text",error:function(jqXHR){checkText("",url);d.reject(jqXHR);},success:function(text){checkText(text,url);$view.registerView(id,text,type,d)}});return d;}},getDeferreds=function(data){var deferreds=[];if(can.isDeferred(data)){return[data]}else{for(var prop in data){if(can.isDeferred(data[prop])){deferreds.push(data[prop]);}}} return deferreds;},usefulPart=function(resolved){return can.isArray(resolved)&&resolved[1]==='success'?resolved[0]:resolved};if(window.steal){steal.type("view js",function(options,success,error){var type=$view.types["."+options.type],id=$view.toId(options.id);options.text="steal('"+(type.plugin||"can/view/"+options.type)+"',function(can){return "+"can.view.preload('"+id+"',"+options.text+");\n})";success();})} can.extend($view,{register:function(info){this.types["."+info.suffix]=info;if(window.steal){steal.type(info.suffix+" view js",function(options,success,error){var type=$view.types["."+options.type],id=$view.toId(options.id+'');options.text=type.script(id,options.text) success();})};$view[info.suffix]=function(id,text){if(!text){return info.renderer(null,id);} $view.preload(id,info.renderer(id,text));return can.view(id);}},registerScript:function(type,id,src){return"can.view.preload('"+id+"',"+$view.types["."+type].script(id,src)+");";},preload:function(id,renderer){$view.cached[id]=new can.Deferred().resolve(function(data,helpers){return renderer.call(data,data,helpers);});return function(){return $view.frag(renderer.apply(this,arguments))};}});var getValueAndObserved=function(func,self){var oldReading;if(can.Observe){oldReading=can.Observe.__reading;can.Observe.__reading=function(obj,attr){observed.push({obj:obj,attr:attr});};} var observed=[],value=func.call(self);if(can.Observe){can.Observe.__reading=oldReading;} return{value:value,observed:observed};},computeBinder=function(getterSetter,context,callback){var observing={},matched=true,data={value:undefined,teardown:function(){for(var name in observing){var ob=observing[name];ob.observe.obj.unbind(ob.observe.attr,onchanged);delete observing[name];}}},batchNum;var onchanged=function(ev){if(ev.batchNum===undefined||ev.batchNum!==batchNum){var oldValue=data.value,newvalue=getValueAndBind();data.value=newvalue;if(newvalue!==oldValue){callback(newvalue,oldValue);} batchNum=batchNum=ev.batchNum;}};var getValueAndBind=function(){var info=getValueAndObserved(getterSetter,context),newObserveSet=info.observed;var value=info.value;matched=!matched;can.each(newObserveSet,function(ob){if(observing[ob.obj._cid+"|"+ob.attr]){observing[ob.obj._cid+"|"+ob.attr].matched=matched;}else{observing[ob.obj._cid+"|"+ob.attr]={matched:matched,observe:ob};ob.obj.bind(ob.attr,onchanged);}});for(var name in observing){var ob=observing[name];if(ob.matched!==matched){ob.observe.obj.unbind(ob.observe.attr,onchanged);delete observing[name];}} return value;};data.value=getValueAndBind();data.isListening=!can.isEmptyObject(observing);return data;} can.compute=function(getterSetter,context){if(getterSetter&&getterSetter.isComputed){return getterSetter;} var computedData,bindings=0,computed,canbind=true;if(typeof getterSetter==="function"){computed=function(value){if(value===undefined){if(computedData){if(bindings&&can.Observe.__reading){can.Observe.__reading(computed,'change');} return computedData.value;}else{return getterSetter.call(context||this)}}else{return getterSetter.apply(context||this,arguments)}}}else{computed=function(val){if(val===undefined){if(can.Observe.__reading){can.Observe.__reading(computed,'change');} return getterSetter;}else{var old=getterSetter;getterSetter=val;if(old!==val){can.Observe.triggerBatch(computed,"change",[val,old]);} return val;}} canbind=false;} computed.isComputed=true;computed.bind=function(ev,handler){can.addEvent.apply(computed,arguments);if(bindings===0&&canbind){computedData=computeBinder(getterSetter,context||this,function(newValue,oldValue){can.Observe.triggerBatch(computed,"change",[newValue,oldValue])});} bindings++;} computed.unbind=function(ev,handler){can.removeEvent.apply(computed,arguments);bindings--;if(bindings===0&&canbind){computedData.teardown();}};return computed;};can.compute.binder=computeBinder;var newLine=/(\r|\n)+/g,tagToContentPropMap={option:"textContent",textarea:"value"},clean=function(content){return content.split('\\').join("\\\\").split("\n").join("\\n").split('"').join('\\"').split("\t").join("\\t");},reverseTagMap={tr:"tbody",option:"select",td:"tr",li:"ul"},getTag=function(tagName,tokens,i){if(tagName){return tagName;}else{while(i":">",'"':'"',"'":"'"};this.tokenComplex=[];this.tokenMap={};for(var i=0,token;token=this.tokens[i];i++){if(token[2]){this.tokenReg.push(token[2]);this.tokenComplex.push({abbr:token[1],re:new RegExp(token[2]),rescan:token[3]});} else{this.tokenReg.push(token[1]);this.tokenSimple[token[1]]=token[0];} this.tokenMap[token[0]]=token[1];} this.tokenReg=new RegExp("("+this.tokenReg.slice(0).concat(["<",">",'"',"'"]).join("|")+")","g");};Scanner.prototype={helpers:[{name:/\s*\(([\$\w]+)\)\s*->([^\n]*)/,fn:function(content){var quickFunc=/\s*\(([\$\w]+)\)\s*->([^\n]*)/,parts=content.match(quickFunc);return"function(__){var "+parts[1]+"=can.$(__);"+parts[2]+"}";}}],scan:function(source,name){var tokens=[],last=0,simple=this.tokenSimple,complex=this.tokenComplex;source=source.replace(newLine,"\n");source.replace(this.tokenReg,function(whole,part){var offset=arguments[arguments.length-2];if(offset>last){tokens.push(source.substring(last,offset));} if(simple[whole]){tokens.push(whole);} else{for(var i=0,token;token=complex[i];i++){if(token.re.test(whole)){tokens.push(token.abbr);if(token.rescan){tokens.push(token.rescan(part));} break;}}} last=offset+part.length;});if(last':htmlTag=0;var emptyElement=content.substr(content.length-1)=="/";if(magicInTag||tagToContentPropMap[tagNames[tagNames.length-1]]){if(emptyElement){put(content.substr(0,content.length-1),",can.view.pending(),\"/>\"");}else{put(content,",can.view.pending(),\">\"");} content='';}else{content+=token;} if(emptyElement){tagNames.pop();tagName=tagNames[tagNames.length-1];} break;case"'":case'"':if(htmlTag){if(quote&"e===token){quote=null;}else if(quote===null){quote=token;beforeQuote=lastToken;}} default:if(lastToken==='<'){tagName=token.split(/\s/)[0];if(tagName.indexOf("/")===0&&tagNames.pop()===tagName.substr(1)){tagName=tagNames[tagNames.length-1];}else{tagNames.push(tagName);}} content+=token;break;}}else{switch(token){case tmap.right:case tmap.returnRight:switch(startTag){case tmap.left:bracketCount=bracketNum(content);if(bracketCount==1){buff.push(insert_cmd,"can.view.txt(0,'"+getTag(tagName,tokens,i)+"',"+status()+",this,function(){",startTxt,content);endStack.push({before:"",after:finishTxt+"}));\n"});} else{last=endStack.length&&bracketCount==-1?endStack.pop():{after:";"};if(last.before){buff.push(last.before);} buff.push(content,";",last.after);} break;case tmap.escapeLeft:case tmap.returnLeft:bracketCount=bracketNum(content);if(bracketCount){endStack.push({before:finishTxt,after:"}));"});} var escaped=startTag===tmap.escapeLeft?1:0,commands={insert:insert_cmd,tagName:tagName,status:status()};for(var ii=0;ii[\s|\w]\w*/.source){escaped=0;} break;}} if(typeof content=='object'){if(content.raw){buff.push(content.raw);}}else{buff.push(insert_cmd,"can.view.txt("+escaped+",'"+tagName+"',"+status()+",this,function(){ "+(this.text.escape||'')+"return ",content,bracketCount?startTxt:"}));");} if(rescan&&rescan.after&&rescan.after.length){put(rescan.after.length);rescan=null;} break;} startTag=null;content='';break;case tmap.templateLeft:content+=tmap.left;break;default:content+=token;break;}} lastToken=token;} if(content.length){put(content);} buff.push(";");var template=buff.join(''),out={out:'with(_VIEW) { with (_CONTEXT) {'+template+" "+finishTxt+"}}"};myEval.call(out,'this.fn = (function(_CONTEXT,_VIEW){'+out.out+'});\r\n//@ sourceURL='+name+".js");return out;}};var canExpando=true;try{document.createTextNode()._=0;}catch(ex){canExpando=false;} var attrMap={"class":"className","value":"value","textContent":"textContent"},tagMap={"":"span",table:"tr",tr:"td",ol:"li",ul:"li",tbody:"tr",thead:"tr",tfoot:"tr",select:"option",optgroup:"option"},attributePlaceholder='__!!__',attributeReplace=/__!!__/g,tagToContentPropMap={option:"textContent",textarea:"value"},bool=can.each(["checked","disabled","readonly","required"],function(n){attrMap[n]=n;}),getParentNode=function(el,defaultParentNode){return defaultParentNode&&el.parentNode.nodeType===11?defaultParentNode:el.parentNode;},setAttr=function(el,attrName,val){var tagName=el.nodeName.toString().toLowerCase(),prop=attrMap[attrName];if(prop){el[prop]=can.inArray(attrName,bool)>-1?true:val;if(prop==="value"&&tagName==="input"){el.defaultValue=val;}}else{el.setAttribute(attrName,val);}},getAttr=function(el,attrName){return(attrMap[attrName]?el[attrMap[attrName]]:el.getAttribute(attrName))||'';},removeAttr=function(el,attrName){if(can.inArray(attrName,bool)>-1){el[attrName]=false;}else{el.removeAttribute(attrName);}},pendingHookups=[],contentText=function(input){if(typeof input=='string'){return input;} if(!input&&input!==0){return'';} var hook=(input.hookup&&function(el,id){input.hookup.call(input,el,id);})||(typeof input=='function'&&input);if(hook){pendingHookups.push(hook);return'';} return""+input;},contentEscape=function(txt){return(typeof txt=='string'||typeof txt=='number')?can.esc(txt):contentText(txt);},nodeMap={},textNodeMap={},nodeListMap={},expando="ejs_"+Math.random(),_id=0,id=function(node){if(canExpando||node.nodeType!==3){if(node[expando]){return node[expando];} else{return node[expando]=(node.nodeName?"element_":"obj_")+(++_id);}} else{for(var textNodeID in textNodeMap){if(textNodeMap[textNodeID]===node){return textNodeID;}} textNodeMap["text_"+(++_id)]=node;return"text_"+_id;}},removeNodeListId=function(node,nodeListId){var nodeListIds=nodeMap[id(node)];if(nodeListIds){var index=can.inArray(nodeListId,nodeListIds);if(index>=0){nodeListIds.splice(index,1);} if(!nodeListIds.length){delete nodeMap[id(node)];}}},addNodeListId=function(node,nodeListId){var nodeListIds=nodeMap[id(node)];if(!nodeListIds){nodeListIds=nodeMap[id(node)]=[];} nodeListIds.push(nodeListId);},tagChildren=function(tagName){var newTag=tagMap[tagName]||"span";if(newTag==="span"){return"@@!!@@";} return"<"+newTag+">"+tagChildren(newTag)+"";};can.extend(can.view,{pending:function(){var hooks=pendingHookups.slice(0);lastHookups=hooks;pendingHookups=[];return can.view.hook(function(el){can.each(hooks,function(fn){fn(el);});});},registerNode:function(nodeList){var nLId=id(nodeList);nodeListMap[nLId]=nodeList;can.each(nodeList,function(node){addNodeListId(node,nLId);});},unregisterNode:function(nodeList){var nLId=id(nodeList);can.each(nodeList,function(node){removeNodeListId(node,nLId);});delete nodeListMap[nLId];},txt:function(escape,tagName,status,self,func){var binding=can.compute.binder(func,self,function(newVal,oldVal){update(newVal,oldVal);});if(!binding.isListening){return(escape||status!==0?contentEscape:contentText)(binding.value);} var parentElement,nodeList,teardown=function(){binding.teardown();if(nodeList){can.view.unregisterNode(nodeList);}},setupTeardownOnDestroy=function(el){can.bind.call(el,'destroyed',teardown);parentElement=el;},teardownCheck=function(parent){if(!parent){teardown();can.unbind.call(parentElement,'destroyed',teardown);}},tag=(tagMap[tagName]||"span"),update,contentProp=tagToContentPropMap[tagName];if(status===0&&!contentProp){return"<"+tag+can.view.hook(escape?function(el,parentNode){update=function(newVal){node.nodeValue=""+newVal;teardownCheck(node.parentNode);};var parent=getParentNode(el,parentNode),node=document.createTextNode(binding.value);parent.insertBefore(node,el);parent.removeChild(el);setupTeardownOnDestroy(parent);}:function(span,parentNode){update=function(newVal){var attached=nodes[0].parentNode;if(attached){makeAndPut(newVal);} teardownCheck(nodes[0].parentNode);};parentNode=getParentNode(span,parentNode);var nodes,makeAndPut=function(val){var frag=can.view.frag(val,parentNode),newNodes=can.makeArray(frag.childNodes),last=nodes?nodes[nodes.length-1]:span;if(last.nextSibling){last.parentNode.insertBefore(frag,last.nextSibling);}else{last.parentNode.appendChild(frag);} if(!nodes){can.remove(can.$(span));nodes=newNodes;nodeList=nodes;can.view.registerNode(nodes);}else{can.remove(can.$(nodes));can.view.replace(nodes,newNodes);}};makeAndPut(binding.value,[span]);setupTeardownOnDestroy(parentNode);})+">"+tagChildren(tag)+"";}else if(status===1){var attrName=binding.value.replace(/['"]/g,'').split('=')[0];pendingHookups.push(function(el){update=function(newVal){var parts=(newVal||"").replace(/['"]/g,'').split('='),newAttrName=parts[0];if((newAttrName!=attrName)&&attrName){removeAttr(el,attrName);} if(newAttrName){setAttr(el,newAttrName,parts[1]);attrName=newAttrName;}};setupTeardownOnDestroy(el);});return binding.value;}else{var attributeName=status===0?contentProp:status;(status===0?lastHookups:pendingHookups).push(function(el){update=function(){setAttr(el,attributeName,hook.render(),contentProp);};var wrapped=can.$(el),hooks;hooks=can.data(wrapped,'hooks');if(!hooks){can.data(wrapped,'hooks',hooks={});} var attr=getAttr(el,attributeName,contentProp),parts=attr.split(attributePlaceholder),goodParts=[],hook;goodParts.push(parts.shift(),parts.join(attributePlaceholder));if(hooks[attributeName]){hooks[attributeName].bindings.push(binding);}else{hooks[attributeName]={render:function(){var i=0,newAttr=attr.replace(attributeReplace,function(){return contentText(hook.bindings[i++].value);});return newAttr;},bindings:[binding],batchNum:undefined};} hook=hooks[attributeName];goodParts.splice(1,0,binding.value);setAttr(el,attributeName,goodParts.join(""),contentProp);setupTeardownOnDestroy(el);});return attributePlaceholder;}},replace:function(oldNodeList,newNodes){oldNodeList=can.makeArray(oldNodeList);can.each(oldNodeList,function(node){can.each(can.makeArray(nodeMap[id(node)]),function(nodeListId){var nodeList=nodeListMap[nodeListId],startIndex=can.inArray(node,nodeList),endIndex=can.inArray(oldNodeList[oldNodeList.length-1],nodeList);if(startIndex>=0&&endIndex>=0){for(var i=startIndex;i<=endIndex;i++){var n=nodeList[i];removeNodeListId(n,nodeListId);} nodeList.splice.apply(nodeList,[startIndex,endIndex-startIndex+1].concat(newNodes));can.each(newNodes,function(node){addNodeListId(node,nodeListId);});}else{can.view.unregisterNode(nodeList);}});});},canExpando:canExpando,textNodeMap:textNodeMap,nodeMap:nodeMap,nodeListMap:nodeListMap});var extend=can.extend,EJS=function(options){if(this.constructor!=EJS){var ejs=new EJS(options);return function(data,helpers){return ejs.render(data,helpers);};} if(typeof options=="function"){this.template={fn:options};return;} extend(this,options);this.template=this.scanner.scan(this.text,this.name);};can.EJS=EJS;EJS.prototype.render=function(object,extraHelpers){object=object||{};return this.template.fn.call(object,object,new EJS.Helpers(object,extraHelpers||{}));};extend(EJS.prototype,{scanner:new can.view.Scanner({tokens:[["templateLeft","<%%"],["templateRight","%>"],["returnLeft","<%=="],["escapeLeft","<%="],["commentLeft","<%#"],["left","<%"],["right","%>"],["returnRight","%>"]]})});EJS.Helpers=function(data,extras){this._data=data;this._extras=extras;extend(this,extras);};EJS.Helpers.prototype={list:function(list,cb){can.each(list,function(item,i){cb(item,i,list)})}};can.view.register({suffix:"ejs",script:function(id,src){return"can.EJS(function(_CONTEXT,_VIEW) { "+new EJS({text:src,name:id}).template.out+" })";},renderer:function(id,text){return EJS({text:text,name:id});}});})(this,jQuery);