var jscolor={bindAuto:true,bindClass:'color',dir:'',bodyElement:document.getElementsByTagName('body')[0],install:function(){jscolor.addEvent(window,'load',jscolor.init)},init:function(){if(jscolor.bindAuto){jscolor.bind()}},getDir:function(){if(!jscolor.dir){var detected=jscolor.detectDir()jscolor.dir=detected!=false?detected:'jscolor/'}return jscolor.dir},detectDir:function(){var base=location.href var e=document.getElementsByTagName('base')for(var i=0;i<e.length;i++){if(e[i].href)base=e[i].href}var e=document.getElementsByTagName('script')for(var i=0;i<e.length;i++){if(e[i].src&&/(^|\/)jscolor\.js([?#].*)?$/i.test(e[i].src)){var src=new jscolor.URI(e[i].src)var srcAbs=src.toAbsolute(base)srcAbs.path=srcAbs.path.replace(/[^\/]+$/,'')delete srcAbs.query delete srcAbs.fragment return srcAbs.toString()}}return false},bind:function(){var matchClass=new RegExp('(^|\\s)('+jscolor.bindClass+')\\s*(\\{[^}]*\\})?','i')var e=document.getElementsByTagName('input')for(var i=0;i<e.length;i++){var m if(e[i].className&&(m=e[i].className.match(matchClass))){var prop={}if(m[3]){try{eval('prop='+m[3])}catch(eInvalidProp){}}e[i].color=new jscolor.color(e[i],prop)}}},fetchElement:function(mixed){return typeof(mixed)=='string'?document.getElementById(mixed):mixed},addEvent:function(el,evnt,func){if(el.addEventListener){el.addEventListener(evnt,func,false)}else if(el.attachEvent){el.attachEvent('on'+evnt,func)}},fireEvent:function(el,evnt){if(!el){return false}else if(document.createEventObject){var ev=document.createEventObject()return el.fireEvent('on'+evnt,ev)}else if(document.createEvent){var ev=document.createEvent('HTMLEvents')ev.initEvent(evnt,true,true)return el.dispatchEvent(ev)}else{if(el['on'+evnt]){return el['on'+evnt]()}else{return false}}},getElementPos:function(e){var e1=e,e2=e var x=0,y=0 if(e1.offsetParent){do{x+=e1.offsetLeft y+=e1.offsetTop}while(e1=e1.offsetParent)}while((e2=e2.parentNode)&&e2.nodeName!='BODY'){x-=e2.scrollLeft y-=e2.scrollTop}return[x,y]},getElementSize:function(e){return[e.offsetWidth,e.offsetHeight]},getMousePos:function(e){if(!e)var e=window.event if(typeof e.pageX=='number'){return[e.pageX,e.pageY]}else if(typeof e.clientX=='number'){return[e.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,e.clientY+document.body.scrollTop+document.documentElement.scrollTop]}},getViewPos:function(){if(typeof window.pageYOffset=='number'){return[window.pageXOffset,window.pageYOffset]}else if(document.body&&(document.body.scrollLeft||document.body.scrollTop)){return[document.body.scrollLeft,document.body.scrollTop]}else if(document.documentElement&&(document.documentElement.scrollLeft||document.documentElement.scrollTop)){return[document.documentElement.scrollLeft,document.documentElement.scrollTop]}else{return[0,0]}},getViewSize:function(){if(typeof window.innerWidth=='number'){return[window.innerWidth,window.innerHeight]}else if(document.body&&(document.body.clientWidth||document.body.clientHeight)){return[document.body.clientWidth,document.body.clientHeight]}else if(document.documentElement&&(document.documentElement.clientWidth||document.documentElement.clientHeight)){return[document.documentElement.clientWidth,document.documentElement.clientHeight]}else{return[0,0]}},URI:function(uri){this.scheme=null this.authority=null this.path=''this.query=null this.fragment=null this.parse=function(uri){var m=uri.match(/^(([A-Za-z][0-9A-Za-z+.-]*)(:))?((\/\/)([^\/?#]*))?([^?#]*)((\?)([^#]*))?((#)(.*))?/)this.scheme=m[3]?m[2]:null this.authority=m[5]?m[6]:null this.path=m[7]this.query=m[9]?m[10]:null this.fragment=m[12]?m[13]:null return this}this.toString=function(){var result=''if(this.scheme!=null)result=result+this.scheme+':'if(this.authority!=null)result=result+'//'+this.authority if(this.path!=null)result=result+this.path if(this.query!=null)result=result+'?'+this.query if(this.fragment!=null)result=result+'#'+this.fragment return result}this.toAbsolute=function(base){var base=new jscolor.URI(base)var r=this var t=new jscolor.URI if(base.scheme==null)return false if(r.scheme!=null&&r.scheme.toLowerCase()==base.scheme.toLowerCase()){r.scheme=null}if(r.scheme!=null){t.scheme=r.scheme t.authority=r.authority t.path=removeDotSegments(r.path)t.query=r.query}else{if(r.authority!=null){t.authority=r.authority t.path=removeDotSegments(r.path)t.query=r.query}else{if(r.path==''){t.path=base.path if(r.query!=null){t.query=r.query}else{t.query=base.query}}else{if(r.path.substr(0,1)=='/'){t.path=removeDotSegments(r.path)}else{if(base.authority!=null&&base.path==''){t.path='/'+r.path}else{t.path=base.path.replace(/[^\/]+$/,'')+r.path}t.path=removeDotSegments(t.path)}t.query=r.query}t.authority=base.authority}t.scheme=base.scheme}t.fragment=r.fragment return t}function removeDotSegments(path){var out=''while(path){if(path.substr(0,3)=='../'||path.substr(0,2)=='./'){path=path.replace(/^\.+/,'').substr(1)}else if(path.substr(0,3)=='/./'||path=='/.'){path='/'+path.substr(3)}else if(path.substr(0,4)=='/../'||path=='/..'){path='/'+path.substr(4)out=out.replace(/\/?[^\/]*$/,'')}else if(path=='.'||path=='..'){path=''}else{var rm=path.match(/^\/?[^\/]*/)[0]path=path.substr(rm.length)out=out+rm}}return out}if(uri){this.parse(uri)}},color:function(target,prop){this.required=true this.adjust=true this.hash=true this.caps=true this.valueElement=target this.styleElement=target this.hsv=[0,1,0]this.rgb=[0,0,0]this.picker=true this.pickerMode='HSV'this.pickerFace=10 this.pickerFaceColor='ThreeDFace'this.pickerBorder=1 this.pickerBorderColor='ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight'this.pickerInset=1 this.pickerInsetColor='ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow'this.pickerZIndex=10000 for(var p in prop)this[p]=prop[p]this.importColor=function(){if(valueElement){if(!this.adjust){if(!this.fromString(valueElement.value,leaveValue)){styleElement.style.backgroundColor=styleElement.jscStyle.backgroundColor styleElement.style.color=styleElement.jscStyle.color this.exportColor(leaveValue|leaveStyle)}}else if(!this.required&&/^\s*$/.test(valueElement.value)){valueElement.value=''styleElement.style.backgroundColor=styleElement.jscStyle.backgroundColor styleElement.style.color=styleElement.jscStyle.color this.exportColor(leaveValue|leaveStyle)}else if(this.fromString(valueElement.value)){}else{this.exportColor()}}else{this.exportColor()}}this.exportColor=function(flags){if(!(flags&leaveValue)&&valueElement){var value=this.toString()if(this.caps)value=value.toUpperCase()if(this.hash)value='#'+value valueElement.value=value}if(!(flags&leaveStyle)&&styleElement){styleElement.style.backgroundColor='#'+this.toString()styleElement.style.color=0.213*this.rgb[0]+0.715*this.rgb[1]+0.072*this.rgb[2]<0.5?'#FFF':'#000'}if(!(flags&leavePad)&&isPickerOwner()){redrawPad()}if(!(flags&leaveSld)&&isPickerOwner()){redrawSld()}}this.fromHSV=function(h,s,v,flags){this.rgb=HSV_RGB(h==null?this.hsv[0]:(this.hsv[0]=h),s==null?this.hsv[1]:(this.hsv[1]=s),v==null?this.hsv[2]:(this.hsv[2]=v))this.exportColor(flags)}this.fromRGB=function(r,g,b,flags){var hsv=RGB_HSV(r==null?this.rgb[0]:(this.rgb[0]=r),g==null?this.rgb[1]:(this.rgb[1]=g),b==null?this.rgb[2]:(this.rgb[2]=b))if(hsv[0]!=null){this.hsv[0]=hsv[0]}if(hsv[2]!=0){this.hsv[1]=hsv[1]}this.hsv[2]=hsv[2]this.exportColor(flags)}this.fromString=function(hex,flags){var m=hex.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i)if(!m){return false}else{if(m[1].length==6){this.fromRGB(parseInt(m[1].substr(0,2),16)/255,parseInt(m[1].substr(2,2),16)/255,parseInt(m[1].substr(4,2),16)/255,flags)}else{this.fromRGB(parseInt(m[1].charAt(0)+m[1].charAt(0),16)/255,parseInt(m[1].charAt(1)+m[1].charAt(1),16)/255,parseInt(m[1].charAt(2)+m[1].charAt(2),16)/255,flags)}return true}}this.toString=function(){return((0x100|Math.round(this.rgb[0]*255)).toString(16).substr(1)+(0x100|Math.round(this.rgb[1]*255)).toString(16).substr(1)+(0x100|Math.round(this.rgb[2]*255)).toString(16).substr(1))}function RGB_HSV(r,g,b){var n=Math.min(Math.min(r,g),b)var v=Math.max(Math.max(r,g),b)var m=v-n if(m==0)return[null,0,v]var h=r==n?3+(b-g)/m:(g==n?5+(r-b)/m:1+(g-r)/m)return[h==6?0:h,m/v,v]}function HSV_RGB(h,s,v){if(h==null)return[v,v,v]var i=Math.floor(h)var f=i%2?h-i:1-(h-i)var m=v*(1-s)var n=v*(1-s*f)switch(i){case 6:case 0:return[v,n,m]case 1:return[n,v,m]case 2:return[m,v,n]case 3:return[m,n,v]case 4:return[n,m,v]case 5:return[v,m,n]}}function hidePicker(){if(isPickerOwner()){removePicker()}}function showPicker(){if(!isPickerOwner()){var tp=jscolor.getElementPos(target)var ts=jscolor.getElementSize(target)var vp=jscolor.getViewPos(target)var vs=jscolor.getViewSize(target)var ps=[2*THIS.pickerBorder+4*THIS.pickerInset+2*THIS.pickerFace+widthPad+2*widthArrow+widthSld,2*THIS.pickerBorder+2*THIS.pickerInset+2*THIS.pickerFace+height]var pp=[-vp[0]+tp[0]+ps[0]>vs[0]?(-vp[0]+tp[0]+ts[0]/2>vs[0]/2&&tp[0]+ts[0]-ps[0]>0?tp[0]+ts[0]-ps[0]:tp[0]):tp[0],-vp[1]+tp[1]+ts[1]+ps[1]>vs[1]?(-vp[1]+tp[1]+ts[1]/2>vs[1]/2&&tp[1]-ps[1]>0?tp[1]-ps[1]:tp[1]+ts[1]):tp[1]+ts[1]]drawPicker(pp[0],pp[1])}}function removePicker(){delete jscolor.picker.owner jscolor.bodyElement.removeChild(jscolor.picker.boxB)}function drawPicker(x,y){if(!jscolor.picker){jscolor.picker={box:document.createElement('div'),boxB:document.createElement('div'),pad:document.createElement('div'),padB:document.createElement('div'),padM:document.createElement('div'),sld:document.createElement('div'),sldB:document.createElement('div'),sldM:document.createElement('div')}for(var i=0,segSize=4;i<height;i+=segSize){var seg=document.createElement('div')seg.style.height=segSize+'px'seg.style.fontSize='1px'seg.style.lineHeight='0'jscolor.picker.sld.appendChild(seg)}jscolor.picker.sldB.appendChild(jscolor.picker.sld)jscolor.picker.box.appendChild(jscolor.picker.sldB)jscolor.picker.box.appendChild(jscolor.picker.sldM)jscolor.picker.padB.appendChild(jscolor.picker.pad)jscolor.picker.box.appendChild(jscolor.picker.padB)jscolor.picker.box.appendChild(jscolor.picker.padM)jscolor.picker.boxB.appendChild(jscolor.picker.box)}var p=jscolor.picker posPad=[x+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset,y+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset]posSld=[null,y+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset]p.box.onmouseup=p.box.onmouseout=function(){target.focus()}p.box.onmousedown=function(){abortBlur=true}p.box.onmousemove=function(e){holdPad&&setPad(e);holdSld&&setSld(e)}p.padM.onmouseup=p.padM.onmouseout=function(){if(holdPad){holdPad=false;jscolor.fireEvent(valueElement,'change')}}p.padM.onmousedown=function(e){holdPad=true;setPad(e)}p.sldM.onmouseup=p.sldM.onmouseout=function(){if(holdSld){holdSld=false;jscolor.fireEvent(valueElement,'change')}}p.sldM.onmousedown=function(e){holdSld=true;setSld(e)}p.box.style.width=4*THIS.pickerInset+2*THIS.pickerFace+widthPad+2*widthArrow+widthSld+'px'p.box.style.height=2*THIS.pickerInset+2*THIS.pickerFace+height+'px'p.boxB.style.position='absolute'p.boxB.style.clear='both'p.boxB.style.left=x+'px'p.boxB.style.top=y+'px'p.boxB.style.zIndex=THIS.pickerZIndex p.boxB.style.border=THIS.pickerBorder+'px solid'p.boxB.style.borderColor=THIS.pickerBorderColor p.boxB.style.background=THIS.pickerFaceColor switch(modeID){case 0:var img='hs.png';break case 1:var img='hv.png';break}p.pad.style.width=widthPad+'px'p.pad.style.height=height+'px'p.pad.style.background="url('"+jscolor.getDir()+img+"') 0 0 no-repeat"p.padB.style.position='absolute'p.padB.style.left=THIS.pickerFace+'px'p.padB.style.top=THIS.pickerFace+'px'p.padB.style.border=THIS.pickerInset+'px solid'p.padB.style.borderColor=THIS.pickerInsetColor p.padM.style.position='absolute'p.padM.style.left='0'p.padM.style.top='0'p.padM.style.width=THIS.pickerFace+2*THIS.pickerInset+widthPad+widthArrow+'px'p.padM.style.height=p.box.style.height p.padM.style.cursor='crosshair'p.padM.style.background="url('"+jscolor.getDir()+"cross.gif') no-repeat"p.sld.style.overflow='hidden'p.sld.style.width=widthSld+'px'p.sld.style.height=height+'px'p.sldB.style.position='absolute'p.sldB.style.right=THIS.pickerFace+'px'p.sldB.style.top=THIS.pickerFace+'px'p.sldB.style.border=THIS.pickerInset+'px solid'p.sldB.style.borderColor=THIS.pickerInsetColor p.sldM.style.position='absolute'p.sldM.style.right='0'p.sldM.style.top='0'p.sldM.style.width=widthSld+widthArrow+THIS.pickerFace+2*THIS.pickerInset+'px'p.sldM.style.height=p.box.style.height p.sldM.style.background="url('"+jscolor.getDir()+"arrow.gif') no-repeat"try{p.sldM.style.cursor='pointer'}catch(eOldIE){p.sldM.style.cursor='hand'}redrawPad()redrawSld()jscolor.picker.owner=THIS jscolor.bodyElement.appendChild(p.boxB)}function redrawPad(){switch(modeID){case 0:var yComponent=1;break case 1:var yComponent=2;break}var x=Math.round((THIS.hsv[0]/6)*(widthPad-1))var y=Math.round((1-THIS.hsv[yComponent])*(height-1))jscolor.picker.padM.style.backgroundPosition=(THIS.pickerFace+THIS.pickerInset+x-7)+'px '+(THIS.pickerFace+THIS.pickerInset+y-7)+'px'var seg=jscolor.picker.sld.childNodes switch(modeID){case 0:var rgb=HSV_RGB(THIS.hsv[0],THIS.hsv[1],1)for(var i=0;i<seg.length;i++){seg[i].style.backgroundColor='rgb('+(rgb[0]*(1-i/seg.length)*100)+'%,'+(rgb[1]*(1-i/seg.length)*100)+'%,'+(rgb[2]*(1-i/seg.length)*100)+'%)'}break case 1:var rgb,s,c=[THIS.hsv[2],0,0]var i=Math.floor(THIS.hsv[0])var f=i%2?THIS.hsv[0]-i:1-(THIS.hsv[0]-i)switch(i){case 6:case 0:rgb=[0,1,2];break case 1:rgb=[1,0,2];break case 2:rgb=[2,0,1];break case 3:rgb=[2,1,0];break case 4:rgb=[1,2,0];break case 5:rgb=[0,2,1];break}for(var i=0;i<seg.length;i++){s=1-1/(seg.length-1)*i c[1]=c[0]*(1-s*f)c[2]=c[0]*(1-s)seg[i].style.backgroundColor='rgb('+(c[rgb[0]]*100)+'%,'+(c[rgb[1]]*100)+'%,'+(c[rgb[2]]*100)+'%)'}break}}function redrawSld(){switch(modeID){case 0:var yComponent=2;break case 1:var yComponent=1;break}var y=Math.round((1-THIS.hsv[yComponent])*(height-1))jscolor.picker.sldM.style.backgroundPosition='0 '+(THIS.pickerFace+THIS.pickerInset+y-5)+'px'}function isPickerOwner(){return jscolor.picker&&jscolor.picker.owner==THIS}function blurTarget(){if(valueElement==target)THIS.importColor()hidePicker()}function blurValue(){if(valueElement!=target)THIS.importColor()}function setPad(e){var posM=jscolor.getMousePos(e)var x=posM[0]-posPad[0]<=0?0:(posM[0]-posPad[0]>widthPad-1?widthPad-1:posM[0]-posPad[0])var y=posM[1]-posPad[1]<=0?0:(posM[1]-posPad[1]>height-1?height-1:posM[1]-posPad[1])switch(modeID){case 0:THIS.fromHSV(x*(6/(widthPad-1)),1-y/(height-1),null,leaveSld);break case 1:THIS.fromHSV(x*(6/(widthPad-1)),null,1-y/(height-1),leaveSld);break}}function setSld(e){var posM=jscolor.getMousePos(e)var y=posM[1]-posSld[1]<=0?0:(posM[1]-posSld[1]>height-1?height-1:posM[1]-posSld[1])switch(modeID){case 0:THIS.fromHSV(null,null,1-y/(height-1),leavePad);break case 1:THIS.fromHSV(null,1-y/(height-1),null,leavePad);break}}var THIS=this var modeID=this.pickerMode.toLowerCase()=='hvs'?1:0 var abortBlur=false var valueElement=jscolor.fetchElement(this.valueElement),styleElement=jscolor.fetchElement(this.styleElement)var holdPad=false,holdSld=false var posPad,posSld var widthSld=16,widthArrow=7,widthPad=181,height=101 var leaveValue=1<<0,leaveStyle=1<<1,leavePad=1<<2,leaveSld=1<<3 jscolor.addEvent(target,'focus',function(){if(THIS.picker)showPicker()})jscolor.addEvent(target,'blur',function(){if(!abortBlur){setTimeout(function(){abortBlur||blurTarget();abortBlur=false},0)}else{abortBlur=false}})if(valueElement){var updateField=function(){THIS.fromString(valueElement.value,leaveValue)}jscolor.addEvent(valueElement,'keyup',updateField)jscolor.addEvent(valueElement,'input',updateField)jscolor.addEvent(valueElement,'blur',blurValue)valueElement.setAttribute('autocomplete','off')}if(styleElement){styleElement.jscStyle={backgroundColor:styleElement.style.backgroundColor,color:styleElement.style.color}}this.importColor()}}jscolor.install()
