diff --git a/.gitignore b/.gitignore
index 75837e9..bf686b4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,4 @@ log/*.log
log/
tmp/
.DS_Store
-public/system
+public/images/photos
diff --git a/README.md b/README.md
index c5f712f..43455e7 100644
--- a/README.md
+++ b/README.md
@@ -39,30 +39,36 @@ Because Rails makes it so easy to run Jasmine unit specs and RSpec (or Cucumber)
* include the angular.min.js and agular-ie-compat.js files—which you can get from https://github.com/angular/angular-seed/tree/master/app/lib/angular — in vendor/assets/javascripts
* update src_files—in spec/javascripts/support/jasmine.yml—to list angular in the vendor assets and the application javascript files in app/assets
-All of the application-specific javascript files are in app/assets/javascript. The html partials are in public/partials.
+All of the application-specific javascript files are in app/assets/javascripts. The html partials are in app/assets/templates.
-Note the following changes to config/environments/production.rb:
+In order for controllers.js to use the html templates from the asset pipeline, we insert the asset names into variables in the document header, and then access those in the route declarations of controllers.js:
- # angular.js change: we need to serve up the templates in public/partials
- config.serve_static_assets = true
-
- # angular.js change: don't uglify because the HTML templates need to know the names of variables
- # and methods in controller.js
- config.assets.js_compressor = Sprockets::LazyCompressor.new { Uglifier.new(:mangle => false) }
-
-The first one poses a problem I have not yet figured out how to solve. controllers.js defines templates within routes like so:
+In app/views/layouts/dynamic.html.erb:
+
+
+In app/assets/javascripts/controllers.js:
- $route.when('/photographers',
- {template: 'partials/photographers.html', controller: PhotographersCtrl});
+ function PhotoGalleryCtrl($route, $xhr) {
+ ...
+ $route.when('/photographers',
+ {template: photographers_template, controller: PhotographersCtrl});
+
+ $route.when('/photographers/:photographer_id/galleries',
+ {template: galleries_template, controller: GalleriesCtrl});
+
+ $route.when('/photographers/:photographer_id/galleries/:gallery_id/photos',
+ {template: photos_template, controller: PhotosCtrl});
- $route.when('/photographers/:photographer_id/galleries',
- {template: 'partials/galleries.html', controller: GalleriesCtrl});
+Note the following change to config/environments/production.rb:
- $route.when('/photographers/:photographer_id/galleries/:gallery_id/photos',
- {template: 'partials/photos.html', controller: PhotosCtrl});
-
-Note that the template paths are hard-coded. I don't see how to adjust these to match Rails' precompiled hash names, so I've left the partials in public/partials instead of moving them to app/assets. This is what necessitates the 'config.serve_static_assets = true' configuration. Unfortunately, this pulls the partials out of the asset pipeline, forcing one to manage file version numbers manually (eg: template: 'partials/photographers.html?3').
+ # angular.js change: don't uglify because the HTML templates need to know the names of variables
+ # and methods in controller.js
+ config.assets.js_compressor = Sprockets::LazyCompressor.new { Uglifier.new(:mangle => false) }
Wrap Params
diff --git a/app/assets/javascripts/controllers.js b/app/assets/javascripts/controllers.js
index d47ebfa..719dfba 100644
--- a/app/assets/javascripts/controllers.js
+++ b/app/assets/javascripts/controllers.js
@@ -36,13 +36,13 @@ function PhotoGalleryCtrl($route, $xhr) {
$route.when('/photographers',
- {template: 'partials/photographers.html', controller: PhotographersCtrl});
+ {template: photographers_template, controller: PhotographersCtrl});
$route.when('/photographers/:photographer_id/galleries',
- {template: 'partials/galleries.html', controller: GalleriesCtrl});
+ {template: galleries_template, controller: GalleriesCtrl});
$route.when('/photographers/:photographer_id/galleries/:gallery_id/photos',
- {template: 'partials/photos.html', controller: PhotosCtrl});
+ {template: photos_template, controller: PhotosCtrl});
$route.otherwise({redirectTo: '/photographers'});
diff --git a/public/partials/galleries.html b/app/assets/templates/galleries.html
similarity index 100%
rename from public/partials/galleries.html
rename to app/assets/templates/galleries.html
diff --git a/public/partials/photographers.html b/app/assets/templates/photographers.html
similarity index 100%
rename from public/partials/photographers.html
rename to app/assets/templates/photographers.html
diff --git a/public/partials/photos.html b/app/assets/templates/photos.html
similarity index 100%
rename from public/partials/photos.html
rename to app/assets/templates/photos.html
diff --git a/app/models/photo.rb b/app/models/photo.rb
index 7342cc9..76b9af3 100644
--- a/app/models/photo.rb
+++ b/app/models/photo.rb
@@ -1,8 +1,10 @@
class Photo < ActiveRecord::Base
has_attached_file :image,
- :styles => { :large => "640x480>",
- :gallery => "200x200#" }
+ :styles => { :large => ["640x480>", :jpg],
+ :gallery => ["200x200#", :jpg] },
+ :url => '/images/photos/:style/:id.:extension',
+ :path => ':rails_root/public/images/photos/:style/:id.:extension'
belongs_to :gallery
diff --git a/app/views/layouts/dynamic.html.erb b/app/views/layouts/dynamic.html.erb
index 2eb38ae..81d90be 100644
--- a/app/views/layouts/dynamic.html.erb
+++ b/app/views/layouts/dynamic.html.erb
@@ -5,6 +5,11 @@
Angular Rails Demo
<%= stylesheet_link_tag "application" %>
<%= csrf_meta_tag %>
+
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 6ff3419..7ec06cf 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -9,9 +9,7 @@
config.action_controller.perform_caching = true
# Disable Rails's static asset server (Apache or nginx will already do this)
- # config.serve_static_assets = false
- # angular.js change: we need to serve up the templates in public/partials
- config.serve_static_assets = true
+ config.serve_static_assets = false
# Compress JavaScripts and CSS
config.assets.compress = true
diff --git a/public/assets/angular-a9d09911e8bdf68a9a5fe18c502ff95e.min.js.gz b/public/assets/angular-a9d09911e8bdf68a9a5fe18c502ff95e.min.js.gz
index 9eb01de..eba186f 100644
Binary files a/public/assets/angular-a9d09911e8bdf68a9a5fe18c502ff95e.min.js.gz and b/public/assets/angular-a9d09911e8bdf68a9a5fe18c502ff95e.min.js.gz differ
diff --git a/public/assets/application-3597a8525f7eb488b1becb03bac7dccf.css.gz b/public/assets/application-3597a8525f7eb488b1becb03bac7dccf.css.gz
index 7e7a15e..b47df31 100644
Binary files a/public/assets/application-3597a8525f7eb488b1becb03bac7dccf.css.gz and b/public/assets/application-3597a8525f7eb488b1becb03bac7dccf.css.gz differ
diff --git a/public/assets/application-c7c4ad1aeb2061970f92d1c167a34ccb.js b/public/assets/application-7d6370eabffcb8599e3573e9cd6dc0c2.js
similarity index 98%
rename from public/assets/application-c7c4ad1aeb2061970f92d1c167a34ccb.js
rename to public/assets/application-7d6370eabffcb8599e3573e9cd6dc0c2.js
index 99d3dc8..35b593a 100644
--- a/public/assets/application-c7c4ad1aeb2061970f92d1c167a34ccb.js
+++ b/public/assets/application-7d6370eabffcb8599e3573e9cd6dc0c2.js
@@ -17,5 +17,5 @@
())),name}},jQuery.support.getSetAttribute||(jQuery.attrFix=jQuery.propFix,formHook=jQuery.attrHooks.name=jQuery.attrHooks.title=jQuery.valHooks.button={get:function(elem,name){var ret;return ret=elem.getAttributeNode(name),ret&&ret.nodeValue!==""?ret.nodeValue:undefined},set:function(elem,value,name){var ret=elem.getAttributeNode(name);if(ret)return ret.nodeValue=value,value}},jQuery.each(["width","height"],function(i,name){jQuery.attrHooks[name]=jQuery.extend(jQuery.attrHooks[name],{set:function(elem,value){if(value==="")return elem.setAttribute(name,"auto"),value}})})),jQuery.support.hrefNormalized||jQuery.each(["href","src","width","height"],function(i,name){jQuery.attrHooks[name]=jQuery.extend(jQuery.attrHooks[name],{get:function(elem){var ret=elem.getAttribute(name,2);return ret===null?undefined:ret}})}),jQuery.support.style||(jQuery.attrHooks.style={get:function(elem){return elem.style.cssText.toLowerCase()||undefined},set:function(elem,value){return elem.style.cssText=""+value}}),jQuery.support.optSelected||(jQuery.propHooks.selected=jQuery.extend(jQuery.propHooks.selected,{get:function(elem){var parent=elem.parentNode;parent&&(parent.selectedIndex,parent.parentNode&&parent.parentNode.selectedIndex)}})),jQuery.support.checkOn||jQuery.each(["radio","checkbox"],function(){jQuery.valHooks[this]={get:function(elem){return elem.getAttribute("value")===null?"on":elem.value}}}),jQuery.each(["radio","checkbox"],function(){jQuery.valHooks[this]=jQuery.extend(jQuery.valHooks[this],{set:function(elem,value){if(jQuery.isArray(value))return elem.checked=jQuery.inArray(jQuery(elem).val(),value)>=0}})});var rnamespaces=/\.(.*)$/,rformElems=/^(?:textarea|input|select)$/i,rperiod=/\./g,rspaces=/ /g,rescape=/[^\w\s.|`]/g,fcleanup=function(nm){return nm.replace(rescape,"\\$&")};jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType===3||elem.nodeType===8)return;if(handler===!1)handler=returnFalse;else if(!handler)return;var handleObjIn,handleObj;handler.handler&&(handleObjIn=handler,handler=handleObjIn.handler),handler.guid||(handler.guid=jQuery.guid++);var elemData=jQuery._data(elem);if(!elemData)return;var events=elemData.events,eventHandle=elemData.handle;events||(elemData.events=events={}),eventHandle||(elemData.handle=eventHandle=function(e){return typeof jQuery!="undefined"&&(!e||jQuery.event.triggered!==e.type)?jQuery.event.handle.apply(eventHandle.elem,arguments):undefined}),eventHandle.elem=elem,types=types.split(" ");var type,i=0,namespaces;while(type=types[i++]){handleObj=handleObjIn?jQuery.extend({},handleObjIn):{handler:handler,data:data},type.indexOf(".")>-1?(namespaces=type.split("."),type=namespaces.shift(),handleObj.namespace=namespaces.slice(0).sort().join(".")):(namespaces=[],handleObj.namespace=""),handleObj.type=type,handleObj.guid||(handleObj.guid=handler.guid);var handlers=events[type],special=jQuery.event.special[type]||{};if(!handlers){handlers=events[type]=[];if(!special.setup||special.setup.call(elem,data,namespaces,eventHandle)===!1)elem.addEventListener?elem.addEventListener(type,eventHandle,!1):elem.attachEvent&&elem.attachEvent("on"+type,eventHandle)}special.add&&(special.add.call(elem,handleObj),handleObj.handler.guid||(handleObj.handler.guid=handler.guid)),handlers.push(handleObj),jQuery.event.global[type]=!0}elem=null},global:{},remove:function(elem,types,handler,pos){if(elem.nodeType===3||elem.nodeType===8)return;handler===!1&&(handler=returnFalse);var ret,type,fn,j,i=0,all,namespaces,namespace,special,eventType,handleObj,origType,elemData=jQuery.hasData(elem)&&jQuery._data(elem),events=elemData&&elemData.events;if(!elemData||!events)return;types&&types.type&&(handler=types.handler,types=types.type);if(!types||typeof types=="string"&&types.charAt(0)==="."){types=types||"";for(type in events)jQuery.event.remove(elem,type+types);return}types=types.split(" ");while(type=types[i++]){origType=type,handleObj=null,all=type.indexOf(".")<0,namespaces=[],all||(namespaces=type.split("."),type=namespaces.shift(),namespace=new RegExp("(^|\\.)"+jQuery.map(namespaces.slice(0).sort(),fcleanup).join("\\.(?:.*\\.)?")+"(\\.|$)")),eventType=events[type];if(!eventType)continue;if(!handler){for(j=0;j=0&&(type=type.slice(0,-1),exclusive=!0),type.indexOf(".")>=0&&(namespaces=type.split("."),type=namespaces.shift(),namespaces.sort());if((!elem||jQuery.event.customEvent[type])&&!jQuery.event.global[type])return;event=typeof event=="object"?event[jQuery.expando]?event:new jQuery.Event(type,event):new jQuery.Event(type),event.type=type,event.exclusive=exclusive,event.namespace=namespaces.join("."),event.namespace_re=new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.)?")+"(\\.|$)");if(onlyHandlers||!elem)event.preventDefault(),event.stopPropagation();if(!elem){jQuery.each(jQuery.cache,function(){var internalKey=jQuery.expando,internalCache=this[internalKey];internalCache&&internalCache.events&&internalCache.events[type]&&jQuery.event.trigger(event,data,internalCache.handle.elem)});return}if(elem.nodeType===3||elem.nodeType===8)return;event.result=undefined,event.target=elem,data=data!=null?jQuery.makeArray(data):[],data.unshift(event);var cur=elem,ontype=type.indexOf(":")<0?"on"+type:"";do{var handle=jQuery._data(cur,"handle");event.currentTarget=cur,handle&&handle.apply(cur,data),ontype&&jQuery.acceptData(cur)&&cur[ontype]&&cur[ontype].apply(cur,data)===!1&&(event.result=!1,event.preventDefault()),cur=cur.parentNode||cur.ownerDocument||cur===event.target.ownerDocument&&window}while(cur&&!event.isPropagationStopped());if(!event.isDefaultPrevented()){var old,special=jQuery.event.special[type]||{};if((!special._default||special._default.call(elem.ownerDocument,event)===!1)&&(type!=="click"||!jQuery.nodeName(elem,"a"))&&jQuery.acceptData(elem)){try{ontype&&elem[type]&&(old=elem[ontype],old&&(elem[ontype]=null),jQuery.event.triggered=type,elem[type]())}catch(ieError){}old&&(elem[ontype]=old),jQuery.event.triggered=undefined}}return event.result},handle:function(event){event=jQuery.event.fix(event||window.event);var handlers=((jQuery._data(this,"events")||{})[event.type]||[]).slice(0),run_all=!event.exclusive&&!event.namespace,args=Array.prototype.slice.call(arguments,0);args[0]=event,event.currentTarget=this;for(var j=0,l=handlers.length;j-1?jQuery.map(elem.options,function(elem){return elem.selected}).join("-"):"":jQuery.nodeName(elem,"select")&&(val=elem.selectedIndex),val},testChange=function(e){var elem=e.target,data,val;if(!rformElems.test(elem.nodeName)||elem.readOnly)return;data=jQuery._data(elem,"_change_data"),val=getVal(elem),(e.type!=="focusout"||elem.type!=="radio")&&jQuery._data(elem,"_change_data",val);if(data===undefined||val===data)return;if(data!=null||val)e.type="change",e.liveFired=undefined,jQuery.event.trigger(e,arguments[1],elem)};jQuery.event.special.change={filters:{focusout:testChange,beforedeactivate:testChange,click:function(e){var elem=e.target,type=jQuery.nodeName(elem,"input")?elem.type:"";(type==="radio"||type==="checkbox"||jQuery.nodeName(elem,"select"))&&testChange.call(this,e)},keydown:function(e){var elem=e.target,type=jQuery.nodeName(elem,"input")?elem.type:"";(e.keyCode===13&&!jQuery.nodeName(elem,"textarea")||e.keyCode===32&&(type==="checkbox"||type==="radio")||type==="select-multiple")&&testChange.call(this,e)},beforeactivate:function(e){var elem=e.target;jQuery._data(elem,"_change_data",getVal(elem))}},setup:function(data,namespaces){if(this.type==="file")return!1;for(var type in changeFilters)jQuery.event.add(this,type+".specialChange",changeFilters[type]);return rformElems.test(this.nodeName)},teardown:function(namespaces){return jQuery.event.remove(this,".specialChange"),rformElems.test(this.nodeName)}},changeFilters=jQuery.event.special.change.filters,changeFilters.focus=changeFilters.beforeactivate}function trigger(type,elem,args){var event=jQuery.extend({},args[0]);event.type=type,event.originalEvent={},event.liveFired=undefined,jQuery.event.handle.call(elem,event),event.isDefaultPrevented()&&args[0].preventDefault()}jQuery.support.focusinBubbles||jQuery.each({focus:"focusin",blur:"focusout"},function(orig,fix){var attaches=0;jQuery.event.special[fix]={setup:function(){attaches++===0&&document.addEventListener(orig,handler,!0)},teardown:function(){--attaches===0&&document.removeEventListener(orig,handler,!0)}};function handler(donor){var e=jQuery.event.fix(donor);e.type=fix,e.originalEvent={},jQuery.event.trigger(e,null,e.target),e.isDefaultPrevented()&&donor.preventDefault()}}),jQuery.each(["bind","one"],function(i,name){jQuery.fn[name]=function(type,data,fn){var handler;if(typeof type=="object"){for(var key in type)this[name](key,data,type[key],fn);return this}if(arguments.length===2||data===!1)fn=data,data=undefined;name==="one"?(handler=function(event){return jQuery(this).unbind(event,handler),fn.apply(this,arguments)},handler.guid=fn.guid||jQuery.guid++):handler=fn;if(type==="unload"&&name!=="one")this.one(type,data,fn);else for(var i=0,l=this.length;imaxLevel)break;event.currentTarget=match.elem,event.data=match.handleObj.data,event.handleObj=match.handleObj,ret=match.handleObj.origHandler.apply(match.elem,arguments);if(ret===!1||event.isPropagationStopped()){maxLevel=match.level,ret===!1&&(stop=!1);if(event.isImmediatePropagationStopped())break}}return stop}function liveConvert(type,selector){return(type&&type!=="*"?type+".":"")+selector.replace(rperiod,"`").replace(rspaces,"&")}jQuery.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(i,name){jQuery.fn[name]=function(data,fn){return fn==null&&(fn=data,data=null),arguments.length>0?this.bind(name,data,fn):this.trigger(name)},jQuery.attrFn&&(jQuery.attrFn[name]=!0)}),function(){var chunker=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,done=0,toString=Object.prototype.toString,hasDuplicate=!1,baseHasDuplicate=!0,rBackslash=/\\/g,rNonWord=/\W/;[0,0].sort(function(){return baseHasDuplicate=!1,0});var Sizzle=function(selector,context,results,seed){results=results||[],context=context||document;var origContext=context;if(context.nodeType!==1&&context.nodeType!==9)return[];if(!selector||typeof selector!="string")return results;var m,set,checkSet,extra,ret,cur,pop,i,prune=!0,contextXML=Sizzle.isXML(context),parts=[],soFar=selector;do{chunker.exec(""),m=chunker.exec(soFar);if(m){soFar=m[3],parts.push(m[1]);if(m[2]){extra=m[3];break}}}while(m);if(parts.length>1&&origPOS.exec(selector))if(parts.length===2&&Expr.relative[parts[0]])set=posProcess(parts[0]+parts[1],context);else{set=Expr.relative[parts[0]]?[context]:Sizzle(parts.shift(),context);while(parts.length)selector=parts.shift(),Expr.relative[selector]&&(selector+=parts.shift()),set=posProcess(selector,set)}else{!seed&&parts.length>1&&context.nodeType===9&&!contextXML&&Expr.match.ID.test(parts[0])&&!Expr.match.ID.test(parts[parts.length-1])&&(ret=Sizzle.find(parts.shift(),context,contextXML),context=ret.expr?Sizzle.filter(ret.expr,ret.set)[0]:ret.set[0]);if(context){ret=seed?{expr:parts.pop(),set:makeArray(seed)}:Sizzle.find(parts.pop(),parts.length===1&&(parts[0]==="~"||parts[0]==="+")&&context.parentNode?context.parentNode:context,contextXML),set=ret.expr?Sizzle.filter(ret.expr,ret.set):ret.set,parts.length>0?checkSet=makeArray(set):prune=!1;while(parts.length)cur=parts.pop(),pop=cur,Expr.relative[cur]?pop=parts.pop():cur="",pop==null&&(pop=context),Expr.relative[cur](checkSet,pop,contextXML)}else checkSet=parts=[]}checkSet||(checkSet=set),checkSet||Sizzle.error(cur||selector);if(toString.call(checkSet)==="[object Array]")if(!prune)results.push.apply(results,checkSet);else if(context&&context.nodeType===1)for(i=0;checkSet[i]!=null;i++)checkSet[i]&&(checkSet[i]===!0||checkSet[i].nodeType===1&&Sizzle.contains(context,checkSet[i]))&&results.push(set[i]);else for(i=0;checkSet[i]!=null;i++)checkSet[i]&&checkSet[i].nodeType===1&&results.push(set[i]);else makeArray(checkSet,results);return extra&&(Sizzle(extra,origContext,results,seed),Sizzle.uniqueSort(results)),results};Sizzle.uniqueSort=function(results){if(sortOrder){hasDuplicate=baseHasDuplicate,results.sort(sortOrder);if(hasDuplicate)for(var i=1;i0},Sizzle.find=function(expr,context,isXML){var set;if(!expr)return[];for(var i=0,l=Expr.order.length;i":function(checkSet,part){var elem,isPartStr=typeof part=="string",i=0,l=checkSet.length;if(isPartStr&&!rNonWord.test(part)){part=part.toLowerCase();for(;i=0)?inplace||result.push(elem):inplace&&(curLoop[i]=!1));return!1},ID:function(match){return match[1].replace(rBackslash,"")},TAG:function(match,curLoop){return match[1].replace(rBackslash,"").toLowerCase()},CHILD:function(match){if(match[1]==="nth"){match[2]||Sizzle.error(match[0]),match[2]=match[2].replace(/^\+|\s*/g,"");var test=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(match[2]==="even"&&"2n"||match[2]==="odd"&&"2n+1"||!/\D/.test(match[2])&&"0n+"+match[2]||match[2]);match[2]=test[1]+(test[2]||1)-0,match[3]=test[3]-0}else match[2]&&Sizzle.error(match[0]);return match[0]=done++,match},ATTR:function(match,curLoop,inplace,result,not,isXML){var name=match[1]=match[1].replace(rBackslash,"");return!isXML&&Expr.attrMap[name]&&(match[1]=Expr.attrMap[name]),match[4]=(match[4]||match[5]||"").replace(rBackslash,""),match[2]==="~="&&(match[4]=" "+match[4]+" "),match},PSEUDO:function(match,curLoop,inplace,result,not){if(match[1]==="not")if((chunker.exec(match[3])||"").length>1||/^\w/.test(match[3]))match[3]=Sizzle(match[3],null,null,curLoop);else{var ret=Sizzle.filter(match[3],curLoop,inplace,!0^not);return inplace||result.push.apply(result,ret),!1}else if(Expr.match.POS.test(match[0])||Expr.match.CHILD.test(match[0]))return!0;return match},POS:function(match){return match.unshift(!0),match}},filters:{enabled:function(elem){return elem.disabled===!1&&elem.type!=="hidden"},disabled:function(elem){return elem.disabled===!0},checked:function(elem){return elem.checked===!0},selected:function(elem){return elem.parentNode&&elem.parentNode.selectedIndex,elem.selected===!0},parent:function(elem){return!!elem.firstChild},empty:function(elem){return!elem.firstChild},has:function(elem,i,match){return!!Sizzle(match[3],elem).length},header:function(elem){return/h\d/i.test(elem.nodeName)},text:function(elem){var attr=elem.getAttribute("type"),type=elem.type;return elem.nodeName.toLowerCase()==="input"&&"text"===type&&(attr===type||attr===null)},radio:function(elem){return elem.nodeName.toLowerCase()==="input"&&"radio"===elem.type},checkbox:function(elem){return elem.nodeName.toLowerCase()==="input"&&"checkbox"===elem.type},file:function(elem){return elem.nodeName.toLowerCase()==="input"&&"file"===elem.type},password:function(elem){return elem.nodeName.toLowerCase()==="input"&&"password"===elem.type},submit:function(elem){var name=elem.nodeName.toLowerCase();return(name==="input"||name==="button")&&"submit"===elem.type},image:function(elem){return elem.nodeName.toLowerCase()==="input"&&"image"===elem.type},reset:function(elem){var name=elem.nodeName.toLowerCase();return(name==="input"||name==="button")&&"reset"===elem.type},button:function(elem){var name=elem.nodeName.toLowerCase();return name==="input"&&"button"===elem.type||name==="button"},input:function(elem){return/input|select|textarea|button/i.test(elem.nodeName)},focus:function(elem){return elem===elem.ownerDocument.activeElement}},setFilters:{first:function(elem,i){return i===0},last:function(elem,i,match,array){return i===array.length-1},even:function(elem,i){return i%2===0},odd:function(elem,i){return i%2===1},lt:function(elem,i,match){return imatch[3]-0},nth:function(elem,i,match){return match[3]-0===i},eq:function(elem,i,match){return match[3]-0===i}},filter:{PSEUDO:function(elem,match,i,array){var name=match[1],filter=Expr.filters[name];if(filter)return filter(elem,i,match,array);if(name==="contains")return(elem.textContent||elem.innerText||Sizzle.getText([elem])||"").indexOf(match[3])>=0;if(name==="not"){var not=match[3];for(var j=0,l=not.length;j=0}},ID:function(elem,match){return elem.nodeType===1&&elem.getAttribute("id")===match},TAG:function(elem,match){return match==="*"&&elem.nodeType===1||elem.nodeName.toLowerCase()===match},CLASS:function(elem,match){return(" "+(elem.className||elem.getAttribute("class"))+" ").indexOf(match)>-1},ATTR:function(elem,match){var name=match[1],result=Expr.attrHandle[name]?Expr.attrHandle[name](elem):elem[name]!=null?elem[name]:elem.getAttribute(name),value=result+"",type=match[2],check=match[4];return result==null?type==="!=":type==="="?value===check:type==="*="?value.indexOf(check)>=0:type==="~="?(" "+value+" ").indexOf(check)>=0:check?type==="!="?value!==check:type==="^="?value.indexOf(check)===0:type==="$="?value.substr(value.length-check.length)===check:type==="|="?value===check||value.substr(0,check.length+1)===check+"-":!1:value&&result!==!1},POS:function(elem,match,i,array){var name=match[2],filter=Expr.setFilters[name];if(filter)return filter(elem,i,match,array)}}},origPOS=Expr.match.POS,fescape=function(all,num){return"\\"+(num-0+1)};for(var type in Expr.match)Expr.match[type]=new RegExp(Expr.match[type].source+/(?![^\[]*\])(?![^\(]*\))/.source),Expr.leftMatch[type]=new RegExp(/(^(?:.|\r|\n)*?)/.source+Expr.match[type].source.replace(/\\(\d+)/g,fescape));var makeArray=function(array,results){return array=Array.prototype.slice
.call(array,0),results?(results.push.apply(results,array),results):array};try{Array.prototype.slice.call(document.documentElement.childNodes,0)[0].nodeType}catch(e){makeArray=function(array,results){var i=0,ret=results||[];if(toString.call(array)==="[object Array]")Array.prototype.push.apply(ret,array);else if(typeof array.length=="number")for(var l=array.length;i ",root.insertBefore(form,root.firstChild),document.getElementById(id)&&(Expr.find.ID=function(match,context,isXML){if(typeof context.getElementById!="undefined"&&!isXML){var m=context.getElementById(match[1]);return m?m.id===match[1]||typeof m.getAttributeNode!="undefined"&&m.getAttributeNode("id").nodeValue===match[1]?[m]:undefined:[]}},Expr.filter.ID=function(elem,match){var node=typeof elem.getAttributeNode!="undefined"&&elem.getAttributeNode("id");return elem.nodeType===1&&node&&node.nodeValue===match}),root.removeChild(form),root=form=null}(),function(){var div=document.createElement("div");div.appendChild(document.createComment("")),div.getElementsByTagName("*").length>0&&(Expr.find.TAG=function(match,context){var results=context.getElementsByTagName(match[1]);if(match[1]==="*"){var tmp=[];for(var i=0;results[i];i++)results[i].nodeType===1&&tmp.push(results[i]);results=tmp}return results}),div.innerHTML=" ",div.firstChild&&typeof div.firstChild.getAttribute!="undefined"&&div.firstChild.getAttribute("href")!=="#"&&(Expr.attrHandle.href=function(elem){return elem.getAttribute("href",2)}),div=null}(),document.querySelectorAll&&function(){var oldSizzle=Sizzle,div=document.createElement("div"),id="__sizzle__";div.innerHTML="
";if(div.querySelectorAll&&div.querySelectorAll(".TEST").length===0)return;Sizzle=function(query,context,extra,seed){context=context||document;if(!seed&&!Sizzle.isXML(context)){var match=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(query);if(match&&(context.nodeType===1||context.nodeType===9)){if(match[1])return makeArray(context.getElementsByTagName(query),extra);if(match[2]&&Expr.find.CLASS&&context.getElementsByClassName)return makeArray(context.getElementsByClassName(match[2]),extra)}if(context.nodeType===9){if(query==="body"&&context.body)return makeArray([context.body],extra);if(match&&match[3]){var elem=context.getElementById(match[3]);if(!elem||!elem.parentNode)return makeArray([],extra);if(elem.id===match[3])return makeArray([elem],extra)}try{return makeArray(context.querySelectorAll(query),extra)}catch(qsaError){}}else if(context.nodeType===1&&context.nodeName.toLowerCase()!=="object"){var oldContext=context,old=context.getAttribute("id"),nid=old||id,hasParent=context.parentNode,relativeHierarchySelector=/^\s*[+~]/.test(query);old?nid=nid.replace(/'/g,"\\$&"):context.setAttribute("id",nid),relativeHierarchySelector&&hasParent&&(context=context.parentNode);try{if(!relativeHierarchySelector||hasParent)return makeArray(context.querySelectorAll("[id='"+nid+"'] "+query),extra)}catch(pseudoError){}finally{old||oldContext.removeAttribute("id")}}}return oldSizzle(query,context,extra,seed)};for(var prop in oldSizzle)Sizzle[prop]=oldSizzle[prop];div=null}(),function(){var html=document.documentElement,matches=html.matchesSelector||html.mozMatchesSelector||html.webkitMatchesSelector||html.msMatchesSelector;if(matches){var disconnectedMatch=!matches.call(document.createElement("div"),"div"),pseudoWorks=!1;try{matches.call(document.documentElement,"[test!='']:sizzle")}catch(pseudoError){pseudoWorks=!0}Sizzle.matchesSelector=function(node,expr){expr=expr.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!Sizzle.isXML(node))try{if(pseudoWorks||!Expr.match.PSEUDO.test(expr)&&!/!=/.test(expr)){var ret=matches.call(node,expr);if(ret||!disconnectedMatch||node.document&&node.document.nodeType!==11)return ret}}catch(e){}return Sizzle(expr,null,null,[node]).length>0}}}(),function(){var div=document.createElement("div");div.innerHTML="
";if(!div.getElementsByClassName||div.getElementsByClassName("e").length===0)return;div.lastChild.className="e";if(div.getElementsByClassName("e").length===1)return;Expr.order.splice(1,0,"CLASS"),Expr.find.CLASS=function(match,context,isXML){if(typeof context.getElementsByClassName!="undefined"&&!isXML)return context.getElementsByClassName(match[1])},div=null}();function dirNodeCheck(dir,cur,doneName,checkSet,nodeCheck,isXML){for(var i=0,l=checkSet.length;i0){match=elem;break}}elem=elem[dir]}checkSet[i]=match}}}document.documentElement.contains?Sizzle.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:document.documentElement.compareDocumentPosition?Sizzle.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:Sizzle.contains=function(){return!1},Sizzle.isXML=function(elem){var documentElement=(elem?elem.ownerDocument||elem:0).documentElement;return documentElement?documentElement.nodeName!=="HTML":!1};var posProcess=function(selector,context){var match,tmpSet=[],later="",root=context.nodeType?[context]:context;while(match=Expr.match.PSEUDO.exec(selector))later+=match[0],selector=selector.replace(Expr.match.PSEUDO,"");selector=Expr.relative[selector]?selector+"*":selector;for(var i=0,l=root.length;i0)for(n=length;n0:this.filter(selector).length>0)},closest:function(selectors,context){var ret=[],i,l,cur=this[0];if(jQuery.isArray(selectors)){var match,selector,matches={},level=1;if(cur&&selectors.length){for(i=0,l=selectors.length;i-1:jQuery(cur).is(match))&&ret.push({selector:selector,elem:cur,level:level});cur=cur.parentNode,level++}}return ret}var pos=POS.test(selectors)||typeof selectors!="string"?jQuery(selectors,context||this.context):0;for(i=0,l=this.length;i-1:jQuery.find.matchesSelector(cur,selectors)){ret.push(cur);break}cur=cur.parentNode;if(!cur||!cur.ownerDocument||cur===context||cur.nodeType===11)break}}return ret=ret.length>1?jQuery.unique(ret):ret,this.pushStack(ret,"closest",selectors)},index:function(elem){return!elem||typeof elem=="string"?jQuery.inArray(this[0],elem?jQuery(elem):this.parent().children()):jQuery.inArray(elem.jquery?elem[0]:elem,this)},add:function(selector,context){var set=typeof selector=="string"?jQuery(selector,context):jQuery.makeArray(selector&&selector.nodeType?[selector]:selector),all=jQuery.merge(this.get(),set);return this.pushStack(isDisconnected(set[0])||isDisconnected(all[0])?all:jQuery.unique(all))},andSelf:function(){return this.add(this.prevObject)}});function isDisconnected(node){return!node||!node.parentNode||node.parentNode.nodeType===11}jQuery.each({parent:function(elem){var parent=elem.parentNode;return parent&&parent.nodeType!==11?parent:null},parents:function(elem){return jQuery.dir(elem,"parentNode")},parentsUntil:function(elem,i,until){return jQuery.dir(elem,"parentNode",until)},next:function(elem){return jQuery.nth(elem,2,"nextSibling")},prev:function(elem){return jQuery.nth(elem,2,"previousSibling")},nextAll:function(elem){return jQuery.dir(elem,"nextSibling")},prevAll:function(elem){return jQuery.dir(elem,"previousSibling")},nextUntil:function(elem,i,until){return jQuery.dir(elem,"nextSibling",until)},prevUntil:function(elem,i,until){return jQuery.dir(elem,"previousSibling",until)},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem)},children:function(elem){return jQuery.sibling(elem.firstChild)},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes)}},function(name,fn){jQuery.fn[name]=function(until,selector){var ret=jQuery.map(this,fn,until),args=slice.call(arguments);return runtil.test(name)||(selector=until),selector&&typeof selector=="string"&&(ret=jQuery.filter(selector,ret)),ret=this.length>1&&!guaranteedUnique[name]?jQuery.unique(ret):ret,(this.length>1||rmultiselector.test(selector))&&rparentsprev.test(name)&&(ret=ret.reverse()),this.pushStack(ret,name,args.join(","))}}),jQuery.extend({filter:function(expr,elems,not){return not&&(expr=":not("+expr+")"),elems.length===1?jQuery.find.matchesSelector(elems[0],expr)?[elems[0]]:[]:jQuery.find.matches(expr,elems)},dir:function(elem,dir,until){var matched=[],cur=elem[dir];while(cur&&cur.nodeType!==9&&(until===undefined||cur.nodeType!==1||!jQuery(cur).is(until)))cur.nodeType===1&&matched.push(cur),cur=cur[dir];return matched},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType===1&&++num===result)break;return cur},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling)n.nodeType===1&&n!==elem&&r.push(n);return r}});function winnow(elements,qualifier,keep){qualifier=qualifier||0;if(jQuery.isFunction(qualifier))return jQuery.grep(elements,function(elem,i){var retVal=!!qualifier.call(elem,i,elem);return retVal===keep});if(qualifier.nodeType)return jQuery.grep(elements,function(elem,i){return elem===qualifier===keep});if(typeof qualifier=="string"){var filtered=jQuery.grep(elements,function(elem){return elem.nodeType===1});if(isSimple.test(qualifier))return jQuery.filter(qualifier,filtered,!keep);qualifier=jQuery.filter(qualifier,filtered)}return jQuery.grep(elements,function(elem,i){return jQuery.inArray(elem,qualifier)>=0===keep})}var rinlinejQuery=/ jQuery\d+="(?:\d+|null)"/g,rleadingWhitespace=/^\s+/,rxhtmlTag=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,rtagName=/<([\w:]+)/,rtbody=/",""],legend:[1,""," "],thead:[1,""],tr:[2,""],td:[3,""],col:[2,""],area:[1,""," "],_default:[0,"",""]};wrapMap.optgroup=wrapMap.option,wrapMap.tbody=wrapMap.tfoot=wrapMap.colgroup=wrapMap.caption=wrapMap.thead,wrapMap.th=wrapMap.td,jQuery.support.htmlSerialize||(wrapMap._default=[1,"div","
"]),jQuery.fn.extend({text:function(text){return jQuery.isFunction(text)?this.each(function(i){var self=jQuery(this);self.text(text.call(this,i,self.text()))}):typeof text!="object"&&text!==undefined?this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text)):jQuery.text(this)},wrapAll:function(html){if(jQuery.isFunction(html))return this.each(function(i){jQuery(this).wrapAll(html.call(this,i))});if(this[0]){var wrap=jQuery(html,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&wrap.insertBefore(this[0]),wrap.map(function(){var elem=this;while(elem.firstChild&&elem.firstChild.nodeType===1)elem=elem.firstChild;return elem}).append(this)}return this},wrapInner:function(html){return jQuery.isFunction(html)?this.each(function(i){jQuery(this).wrapInner(html.call(this,i))}):this.each(function(){var self=jQuery(this),contents=self.contents();contents.length?contents.wrapAll(html):self.append(html)})},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html)})},unwrap:function(){return this.parent().each(function(){jQuery.nodeName(this,"body")||jQuery(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(elem){this.nodeType===1&&this.appendChild(elem)})},prepend:function(){return this.domManip(arguments,!0,function(elem){this.nodeType===1&&this.insertBefore(elem,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(elem){this.parentNode.insertBefore(elem,this)});if(arguments.length){var set=jQuery(arguments[0]);return set.push.apply(set,this.toArray()),this.pushStack(set,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(elem){this.parentNode.insertBefore(elem,this.nextSibling)});if(arguments.length){var set=this.pushStack(this,"after",arguments);return set.push.apply(set,jQuery(arguments[0]).toArray()),set}},remove:function(selector,keepData){for(var i=0,elem;(elem=this[i])!=null;i++)if(!selector||jQuery.filter(selector,[elem]).length)!keepData&&elem.nodeType===1&&(jQuery.cleanData(elem.getElementsByTagName("*")),jQuery.cleanData([elem])),elem.parentNode&&elem.parentNode.removeChild(elem);return this},empty:function(){for(var i=0,elem;(elem=this[i])!=null;i++){elem.nodeType===1&&jQuery.cleanData(elem.getElementsByTagName("*"));while(elem.firstChild)elem.removeChild(elem.firstChild)}return this},clone:function(dataAndEvents,deepDataAndEvents){return dataAndEvents=dataAndEvents==null?!1:dataAndEvents,deepDataAndEvents=deepDataAndEvents==null?dataAndEvents:deepDataAndEvents,this.map(function(){return jQuery.clone(this,dataAndEvents,deepDataAndEvents)})},html:function(value){if(value===undefined)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(rinlinejQuery,""):null;if(typeof value=="string"&&!rnocache.test(value)&&(jQuery.support.leadingWhitespace||!rleadingWhitespace.test(value))&&!wrapMap[(rtagName.exec(value)||["",""])[1].toLowerCase()]){value=value.replace(rxhtmlTag,"<$1>$2>");try{for(var i=0,l=this.length;i1&&i0?this.clone(!0):this).get();jQuery(insert[i])[original](elems),ret=ret.concat(elems)}return this.pushStack(ret,name,insert.selector)}});function getAll(elem){return"getElementsByTagName"in elem?elem.getElementsByTagName("*"):"querySelectorAll"in elem?elem.querySelectorAll("*"):[]}function fixDefaultChecked(elem){if(elem.type==="checkbox"||elem.type==="radio")elem.defaultChecked=elem.checked}function findInputs(elem){jQuery.nodeName(elem,"input")?fixDefaultChecked(elem):"getElementsByTagName"in elem&&jQuery.grep(elem.getElementsByTagName("input"),fixDefaultChecked)}jQuery.extend({clone:function(elem,dataAndEvents,deepDataAndEvents){var clone=elem.cloneNode(!0),srcElements,destElements,i;if((!jQuery.support.noCloneEvent||!jQuery.support.noCloneChecked)&&(elem.nodeType===1||elem.nodeType===11)&&!jQuery.isXMLDoc(elem)){cloneFixAttributes(elem,clone),srcElements=getAll(elem),destElements=getAll(clone);for(i=0;srcElements[i];++i)cloneFixAttributes(srcElements[i],destElements[i])}if(dataAndEvents){cloneCopyEvent(elem,clone);if(deepDataAndEvents){srcElements=getAll(elem),destElements=getAll(clone);for(i=0;srcElements[i];++i)cloneCopyEvent(srcElements[i],destElements[i])}}return srcElements=destElements=null,clone},clean:function(elems,context,fragment,scripts){var checkScriptType;context=context||document,typeof context.createElement=="undefined"&&(context=context.ownerDocument||context[0]&&context[0].ownerDocument||document);var ret=[],j;for(var i=0,elem;(elem=elems[i])!=null;i++){typeof elem=="number"&&(elem+="");if(!elem)continue;if(typeof elem=="string")if(!rhtml.test(elem))elem=context.createTextNode(elem);else{elem=elem.replace(rxhtmlTag,"<$1>$2>");var tag=(rtagName.exec(elem)||["",""])[1].toLowerCase(),wrap=wrapMap[tag]||wrapMap._default,depth=wrap[0],div=context.createElement("div");div.innerHTML=wrap[1]+elem+wrap[2];while(depth--)div=div.lastChild;if(!jQuery.support.tbody){var hasBody=rtbody.test(elem),tbody=tag==="table"&&!hasBody?div.firstChild&&div.firstChild.childNodes:wrap[1]===""&&!hasBody?div.childNodes:[];for(j=tbody.length-1;j>=0;--j)jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length&&tbody[j].parentNode.removeChild(tbody[j])}!jQuery.support.leadingWhitespace&&rleadingWhitespace.test(elem)&&div.insertBefore(context.createTextNode(rleadingWhitespace.exec(elem)[0]),div.firstChild),elem=div.childNodes}var len;if(!jQuery.support.appendChecked)if(elem[0]&&typeof (len=elem.length)=="number")for(j=0;j=0)return value+"px"}}}),jQuery.support.opacity||(jQuery.cssHooks.opacity={get:function(elem,computed){return ropacity.test((computed&&elem.currentStyle?elem.currentStyle.filter:elem.style.filter)||"")?parseFloat(RegExp.$1)/100+"":computed?"1":""},set:function(elem,value){var style=elem.style,currentStyle=elem.currentStyle;style.zoom=1;var opacity=jQuery.isNaN(value)?"":"alpha(opacity="+value*100+")",filter=currentStyle&¤tStyle.filter||style.filter||"";style.filter=ralpha.test(filter)?filter.replace(ralpha,opacity):filter+" "+opacity}}),jQuery(function(){jQuery.support.reliableMarginRight||(jQuery.cssHooks.marginRight={get:function(elem,computed){var ret;return jQuery.swap(elem,{display:"inline-block"},function(){computed?ret=curCSS(elem,"margin-right","marginRight"):ret=elem.style.marginRight}),ret}})}),document.defaultView&&document.defaultView.getComputedStyle&&(getComputedStyle=function(elem,name){var ret,defaultView,computedStyle;name=name.replace(rupper,"-$1").toLowerCase();if(!(defaultView=elem.ownerDocument.defaultView))return undefined;if(computedStyle=defaultView.getComputedStyle(elem,null))ret=computedStyle.getPropertyValue(name),ret===""&&!jQuery.contains(elem.ownerDocument.documentElement,elem)&&(ret=jQuery.style(elem,name));return ret}),document.documentElement.currentStyle&&(currentStyle=function(elem,name){var left,ret=elem.currentStyle&&elem.currentStyle[name],rsLeft=elem.runtimeStyle&&elem.runtimeStyle[name],style=elem.style;return!rnumpx.test(ret)&&rnum.test(ret)&&(left=style.left,rsLeft&&(elem.runtimeStyle.left=elem.currentStyle.left),style.left=name==="fontSize"?"1em":ret||0,ret=style.pixelLeft+"px",style.left=left,rsLeft&&(elem.runtimeStyle.left=rsLeft)),ret===""?"auto":ret}),curCSS=getComputedStyle||currentStyle;function getWH(elem,name,extra){var val=name==="width"?elem.offsetWidth:elem.offsetHeight,which=name==="width"?cssWidth:cssHeight;if(val>0)return extra!=="border"&&jQuery.each(which,function(){extra||(val-=parseFloat(jQuery.css(elem,"padding"+this))||0),extra==="margin"?val+=parseFloat(jQuery.css(elem,extra+this))||0:val-=parseFloat(jQuery.css(elem,"border"+this+"Width"))||0}),val+"px";val=curCSS(elem,name,name);if(val<0||val==null)val=elem.style[name]||0;return val=parseFloat(val)||0,extra&&jQuery.each(which,function(){val+=parseFloat(jQuery.css(elem,"padding"+this))||0,extra!=="padding"&&(val+=parseFloat(jQuery.css(elem,"border"+this+"Width"))||0),extra==="margin"&&(val+=parseFloat(jQuery.css(elem,extra+this))||0)}),val+"px"}jQuery.expr&&jQuery.expr.filters&&(jQuery.expr.filters.hidden=function(elem){var width=elem.offsetWidth,height=elem.offsetHeight;return width===0&&height===0||!jQuery.support.reliableHiddenOffsets&&(elem.style.display||jQuery.css(elem,"display"))==="none"},jQuery.expr.filters.visible=function(elem){return!jQuery.expr.filters.hidden(elem)});var r20=/%20/g,rbracket=/\[\]$/,rCRLF=/\r?\n/g,rhash=/#.*$/,rheaders=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,rinput=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,rlocalProtocol=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,rnoContent=/^(?:GET|HEAD)$/,rprotocol=/^\/\//,rquery=/\?/,rscript=/