

/**
 * AJAX Upload ( http://valums.com/ajax-upload/ ) 
 * Copyright (c) Andris Valums
 * Licensed under the MIT license ( http://valums.com/mit-license/ )
 * Thanks to Gary Haran, David Mark, Corey Burns and others for contributions 
 */

(function(){function log(){if(typeof(console)!='undefined'&&typeof(console.log)=='function'){Array.prototype.unshift.call(arguments,'[Ajax Upload]');console.log(Array.prototype.join.call(arguments,' '));}}
function addEvent(el,type,fn){if(el.addEventListener){el.addEventListener(type,fn,false);}else if(el.attachEvent){el.attachEvent('on'+type,function(){fn.call(el);});}else{throw new Error('not supported or DOM not loaded');}}
function addResizeEvent(fn){var timeout;addEvent(window,'resize',function(){if(timeout){clearTimeout(timeout);}
timeout=setTimeout(fn,100);});}
if(document.documentElement.getBoundingClientRect){var getOffset=function(el){var box=el.getBoundingClientRect();var doc=el.ownerDocument;var body=doc.body;var docElem=doc.documentElement;var clientTop=docElem.clientTop||body.clientTop||0;var clientLeft=docElem.clientLeft||body.clientLeft||0;var zoom=1;if(body.getBoundingClientRect){var bound=body.getBoundingClientRect();zoom=(bound.right-bound.left)/body.clientWidth;}
if(zoom>1){clientTop=0;clientLeft=0;}
var top=box.top/zoom+(window.pageYOffset||docElem&&docElem.scrollTop/zoom||body.scrollTop/zoom)-clientTop,left=box.left/zoom+(window.pageXOffset||docElem&&docElem.scrollLeft/zoom||body.scrollLeft/zoom)-clientLeft;return{top:top,left:left};};}else{var getOffset=function(el){var top=0,left=0;do{top+=el.offsetTop||0;left+=el.offsetLeft||0;el=el.offsetParent;}while(el);return{left:left,top:top};};}
function getBox(el){var left,right,top,bottom;var offset=getOffset(el);left=offset.left;top=offset.top;right=left+el.offsetWidth;bottom=top+el.offsetHeight;return{left:left,right:right,top:top,bottom:bottom};}
function addStyles(el,styles){for(var name in styles){if(styles.hasOwnProperty(name)){el.style[name]=styles[name];}}}
function copyLayout(from,to){var box=getBox(from);addStyles(to,{position:'absolute',left:box.left+'px',top:box.top+'px',width:from.offsetWidth+'px',height:from.offsetHeight+'px'});}
var toElement=(function(){var div=document.createElement('div');return function(html){div.innerHTML=html;var el=div.firstChild;return div.removeChild(el);};})();var getUID=(function(){var id=0;return function(){return'ValumsAjaxUpload'+id++;};})();function fileFromPath(file){return file.replace(/.*(\/|\\)/,"");}
function getExt(file){return(-1!==file.indexOf('.'))?file.replace(/.*[.]/,''):'';}
function hasClass(el,name){var re=new RegExp('\\b'+name+'\\b');return re.test(el.className);}
function addClass(el,name){if(!hasClass(el,name)){el.className+=' '+name;}}
function removeClass(el,name){var re=new RegExp('\\b'+name+'\\b');el.className=el.className.replace(re,'');}
function removeNode(el){el.parentNode.removeChild(el);}
window.AjaxUpload=function(button,options){this._settings={action:'upload.php',name:'userfile',data:{},autoSubmit:true,responseType:false,hoverClass:'hover',disabledClass:'disabled',onChange:function(file,extension){},onSubmit:function(file,extension){},onComplete:function(file,response){}};for(var i in options){if(options.hasOwnProperty(i)){this._settings[i]=options[i];}}
if(button.jquery){button=button[0];}else if(typeof button=="string"){if(/^#.*/.test(button)){button=button.slice(1);}
button=document.getElementById(button);}
if(!button||button.nodeType!==1){throw new Error("Please make sure that you're passing a valid element");}
if(button.nodeName.toUpperCase()=='A'){addEvent(button,'click',function(e){if(e&&e.preventDefault){e.preventDefault();}else if(window.event){window.event.returnValue=false;}});}
this._button=button;this._input=null;this._disabled=false;this.enable();this._rerouteClicks();};AjaxUpload.prototype={setData:function(data){this._settings.data=data;},disable:function(){addClass(this._button,this._settings.disabledClass);this._disabled=true;var nodeName=this._button.nodeName.toUpperCase();if(nodeName=='INPUT'||nodeName=='BUTTON'){this._button.setAttribute('disabled','disabled');}
if(this._input){this._input.parentNode.style.visibility='hidden';}},enable:function(){removeClass(this._button,this._settings.disabledClass);this._button.removeAttribute('disabled');this._disabled=false;},_createInput:function(){var self=this;var input=document.createElement("input");input.setAttribute('type','file');input.setAttribute('name',this._settings.name);addStyles(input,{'position':'absolute','right':0,'margin':0,'padding':0,'fontSize':'480px','cursor':'pointer'});var div=document.createElement("div");addStyles(div,{'display':'block','position':'absolute','overflow':'hidden','margin':0,'padding':0,'opacity':0,'direction':'ltr','zIndex':2147483583});if(div.style.opacity!=="0"){if(typeof(div.filters)=='undefined'){throw new Error('Opacity not supported by the browser');}
div.style.filter="alpha(opacity=0)";}
addEvent(input,'change',function(){if(!input||input.value===''){return;}
var file=fileFromPath(input.value);if(false===self._settings.onChange.call(self,file,getExt(file))){self._clearInput();return;}
if(self._settings.autoSubmit){self.submit();}});addEvent(input,'mouseover',function(){addClass(self._button,self._settings.hoverClass);});addEvent(input,'mouseout',function(){removeClass(self._button,self._settings.hoverClass);input.parentNode.style.visibility='hidden';});div.appendChild(input);document.body.appendChild(div);this._input=input;},_clearInput:function(){if(!this._input){return;}
removeNode(this._input.parentNode);this._input=null;this._createInput();removeClass(this._button,this._settings.hoverClass);},_rerouteClicks:function(){var self=this;addEvent(self._button,'mouseover',function(){if(self._disabled){return;}
if(!self._input){self._createInput();}
var div=self._input.parentNode;copyLayout(self._button,div);div.style.visibility='visible';});},_createIframe:function(){var id=getUID();var iframe=toElement('<iframe src="javascript:false;" name="'+id+'" />');iframe.setAttribute('id',id);iframe.style.display='none';document.body.appendChild(iframe);return iframe;},_createForm:function(iframe){var settings=this._settings;var form=toElement('<form method="post" enctype="multipart/form-data"></form>');form.setAttribute('action',settings.action);form.setAttribute('target',iframe.name);form.style.display='none';document.body.appendChild(form);for(var prop in settings.data){if(settings.data.hasOwnProperty(prop)){var el=document.createElement("input");el.setAttribute('type','hidden');el.setAttribute('name',prop);el.setAttribute('value',settings.data[prop]);form.appendChild(el);}}
return form;},_getResponse:function(iframe,file){var toDeleteFlag=false,self=this,settings=this._settings;addEvent(iframe,'load',function(){if(iframe.src=="javascript:'%3Chtml%3E%3C/html%3E';"||iframe.src=="javascript:'<html></html>';"){if(toDeleteFlag){setTimeout(function(){removeNode(iframe);},0);}
return;}
var doc=iframe.contentDocument?iframe.contentDocument:window.frames[iframe.id].document;if(doc.readyState&&doc.readyState!='complete'){return;}
if(doc.body&&doc.body.innerHTML=="false"){return;}
var response;if(doc.XMLDocument){response=doc.XMLDocument;}else if(doc.body){response=doc.body.innerHTML;if(settings.responseType&&settings.responseType.toLowerCase()=='json'){if(doc.body.firstChild&&doc.body.firstChild.nodeName.toUpperCase()=='PRE'){response=doc.body.firstChild.firstChild.nodeValue;}
if(response){response=eval("("+response+")");}else{response={};}}}else{response=doc;}
settings.onComplete.call(self,file,response);toDeleteFlag=true;iframe.src="javascript:'<html></html>';";});},submit:function(){var self=this,settings=this._settings;if(!this._input||this._input.value===''){return;}
var file=fileFromPath(this._input.value);if(false===settings.onSubmit.call(this,file,getExt(file))){this._clearInput();return;}
var iframe=this._createIframe();var form=this._createForm(iframe);removeNode(this._input.parentNode);removeClass(self._button,self._settings.hoverClass);form.appendChild(this._input);form.submit();removeNode(form);form=null;removeNode(this._input);this._input=null;this._getResponse(iframe,file);this._createInput();}};})();

/**
 * Jcrop v.0.9.8 (minimized)
 * (c) 2008 Kelly Hallman and DeepLiquid.com
 * More information: http://deepliquid.com/content/Jcrop.html
 * Released under MIT License - this header must remain with code
 */


(function($){$.Jcrop=function(obj,opt)
{var obj=obj,opt=opt;if(typeof(obj)!=='object')obj=$(obj)[0];if(typeof(opt)!=='object')opt={};if(!('trackDocument'in opt))
{opt.trackDocument=$.browser.msie?false:true;if($.browser.msie&&$.browser.version.split('.')[0]=='8')
opt.trackDocument=true;}
if(!('keySupport'in opt))
opt.keySupport=$.browser.msie?false:true;var defaults={trackDocument:false,baseClass:'jcrop',addClass:null,bgColor:'black',bgOpacity:.6,borderOpacity:.4,handleOpacity:.5,handlePad:5,handleSize:9,handleOffset:5,edgeMargin:14,aspectRatio:0,keySupport:true,cornerHandles:true,sideHandles:true,drawBorders:true,dragEdges:true,boxWidth:0,boxHeight:0,boundary:8,animationDelay:20,swingSpeed:3,allowSelect:true,allowMove:true,allowResize:true,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){}};var options=defaults;setOptions(opt);var $origimg=$(obj);var $img=$origimg.clone().removeAttr('id').css({position:'absolute'});$img.width($origimg.width());$img.height($origimg.height());$origimg.after($img).hide();presize($img,options.boxWidth,options.boxHeight);var boundx=$img.width(),boundy=$img.height(),$div=$('<div />').width(boundx).height(boundy).addClass(cssClass('holder')).css({position:'relative',backgroundColor:options.bgColor}).insertAfter($origimg).append($img);;if(options.addClass)$div.addClass(options.addClass);var $img2=$('<img />').attr('src',$img.attr('src')).css('position','absolute').width(boundx).height(boundy);var $img_holder=$('<div />').width(pct(100)).height(pct(100)).css({zIndex:310,position:'absolute',overflow:'hidden'}).append($img2);var $hdl_holder=$('<div />').width(pct(100)).height(pct(100)).css('zIndex',320);var $sel=$('<div />').css({position:'absolute',zIndex:300}).insertBefore($img).append($img_holder,$hdl_holder);var bound=options.boundary;var $trk=newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)).css({position:'absolute',top:px(-bound),left:px(-bound),zIndex:290}).mousedown(newSelection);var xlimit,ylimit,xmin,ymin;var xscale,yscale,enabled=true;var docOffset=getPos($img),btndown,lastcurs,dimmed,animating,shift_down;var Coords=function()
{var x1=0,y1=0,x2=0,y2=0,ox,oy;function setPressed(pos)
{var pos=rebound(pos);x2=x1=pos[0];y2=y1=pos[1];};function setCurrent(pos)
{var pos=rebound(pos);ox=pos[0]-x2;oy=pos[1]-y2;x2=pos[0];y2=pos[1];};function getOffset()
{return[ox,oy];};function moveOffset(offset)
{var ox=offset[0],oy=offset[1];if(0>x1+ox)ox-=ox+x1;if(0>y1+oy)oy-=oy+y1;if(boundy<y2+oy)oy+=boundy-(y2+oy);if(boundx<x2+ox)ox+=boundx-(x2+ox);x1+=ox;x2+=ox;y1+=oy;y2+=oy;};function getCorner(ord)
{var c=getFixed();switch(ord)
{case'ne':return[c.x2,c.y];case'nw':return[c.x,c.y];case'se':return[c.x2,c.y2];case'sw':return[c.x,c.y2];}};function getFixed()
{if(!options.aspectRatio)return getRect();var aspect=options.aspectRatio,min_x=options.minSize[0]/xscale,min_y=options.minSize[1]/yscale,max_x=options.maxSize[0]/xscale,max_y=options.maxSize[1]/yscale,rw=x2-x1,rh=y2-y1,rwa=Math.abs(rw),rha=Math.abs(rh),real_ratio=rwa/rha,xx,yy;if(max_x==0){max_x=boundx*10}
if(max_y==0){max_y=boundy*10}
if(real_ratio<aspect)
{yy=y2;w=rha*aspect;xx=rw<0?x1-w:w+x1;if(xx<0)
{xx=0;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}
else if(xx>boundx)
{xx=boundx;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}}
else
{xx=x2;h=rwa/aspect;yy=rh<0?y1-h:y1+h;if(yy<0)
{yy=0;w=Math.abs((yy-y1)*aspect);xx=rw<0?x1-w:w+x1;}
else if(yy>boundy)
{yy=boundy;w=Math.abs(yy-y1)*aspect;xx=rw<0?x1-w:w+x1;}}
if(xx>x1){if(xx-x1<min_x){xx=x1+min_x;}else if(xx-x1>max_x){xx=x1+max_x;}
if(yy>y1){yy=y1+(xx-x1)/aspect;}else{yy=y1-(xx-x1)/aspect;}}else if(xx<x1){if(x1-xx<min_x){xx=x1-min_x}else if(x1-xx>max_x){xx=x1-max_x;}
if(yy>y1){yy=y1+(x1-xx)/aspect;}else{yy=y1-(x1-xx)/aspect;}}
if(xx<0){x1-=xx;xx=0;}else if(xx>boundx){x1-=xx-boundx;xx=boundx;}
if(yy<0){y1-=yy;yy=0;}else if(yy>boundy){y1-=yy-boundy;yy=boundy;}
return last=makeObj(flipCoords(x1,y1,xx,yy));};function rebound(p)
{if(p[0]<0)p[0]=0;if(p[1]<0)p[1]=0;if(p[0]>boundx)p[0]=boundx;if(p[1]>boundy)p[1]=boundy;return[p[0],p[1]];};function flipCoords(x1,y1,x2,y2)
{var xa=x1,xb=x2,ya=y1,yb=y2;if(x2<x1)
{xa=x2;xb=x1;}
if(y2<y1)
{ya=y2;yb=y1;}
return[Math.round(xa),Math.round(ya),Math.round(xb),Math.round(yb)];};function getRect()
{var xsize=x2-x1;var ysize=y2-y1;if(xlimit&&(Math.abs(xsize)>xlimit))
x2=(xsize>0)?(x1+xlimit):(x1-xlimit);if(ylimit&&(Math.abs(ysize)>ylimit))
y2=(ysize>0)?(y1+ylimit):(y1-ylimit);if(ymin&&(Math.abs(ysize)<ymin))
y2=(ysize>0)?(y1+ymin):(y1-ymin);if(xmin&&(Math.abs(xsize)<xmin))
x2=(xsize>0)?(x1+xmin):(x1-xmin);if(x1<0){x2-=x1;x1-=x1;}
if(y1<0){y2-=y1;y1-=y1;}
if(x2<0){x1-=x2;x2-=x2;}
if(y2<0){y1-=y2;y2-=y2;}
if(x2>boundx){var delta=x2-boundx;x1-=delta;x2-=delta;}
if(y2>boundy){var delta=y2-boundy;y1-=delta;y2-=delta;}
if(x1>boundx){var delta=x1-boundy;y2-=delta;y1-=delta;}
if(y1>boundy){var delta=y1-boundy;y2-=delta;y1-=delta;}
return makeObj(flipCoords(x1,y1,x2,y2));};function makeObj(a)
{return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]};};return{flipCoords:flipCoords,setPressed:setPressed,setCurrent:setCurrent,getOffset:getOffset,moveOffset:moveOffset,getCorner:getCorner,getFixed:getFixed};}();var Selection=function()
{var start,end,dragmode,awake,hdep=370;var borders={};var handle={};var seehandles=false;var hhs=options.handleOffset;if(options.drawBorders){borders={top:insertBorder('hline').css('top',$.browser.msie?px(-1):px(0)),bottom:insertBorder('hline'),left:insertBorder('vline'),right:insertBorder('vline')};}
if(options.dragEdges){handle.t=insertDragbar('n');handle.b=insertDragbar('s');handle.r=insertDragbar('e');handle.l=insertDragbar('w');}
options.sideHandles&&createHandles(['n','s','e','w']);options.cornerHandles&&createHandles(['sw','nw','ne','se']);function insertBorder(type)
{var jq=$('<div />').css({position:'absolute',opacity:options.borderOpacity}).addClass(cssClass(type));$img_holder.append(jq);return jq;};function dragDiv(ord,zi)
{var jq=$('<div />').mousedown(createDragger(ord)).css({cursor:ord+'-resize',position:'absolute',zIndex:zi});$hdl_holder.append(jq);return jq;};function insertHandle(ord)
{return dragDiv(ord,hdep++).css({top:px(-hhs+1),left:px(-hhs+1),opacity:options.handleOpacity}).addClass(cssClass('handle'));};function insertDragbar(ord)
{var s=options.handleSize,o=hhs,h=s,w=s,t=o,l=o;switch(ord)
{case'n':case's':w=pct(100);break;case'e':case'w':h=pct(100);break;}
return dragDiv(ord,hdep++).width(w).height(h).css({top:px(-t+1),left:px(-l+1)});};function createHandles(li)
{for(i in li)handle[li[i]]=insertHandle(li[i]);};function moveHandles(c)
{var midvert=Math.round((c.h/2)-hhs),midhoriz=Math.round((c.w/2)-hhs),north=west=-hhs+1,east=c.w-hhs,south=c.h-hhs,x,y;'e'in handle&&handle.e.css({top:px(midvert),left:px(east)})&&handle.w.css({top:px(midvert)})&&handle.s.css({top:px(south),left:px(midhoriz)})&&handle.n.css({left:px(midhoriz)});'ne'in handle&&handle.ne.css({left:px(east)})&&handle.se.css({top:px(south),left:px(east)})&&handle.sw.css({top:px(south)});'b'in handle&&handle.b.css({top:px(south)})&&handle.r.css({left:px(east)});};function moveto(x,y)
{$img2.css({top:px(-y),left:px(-x)});$sel.css({top:px(y),left:px(x)});};function resize(w,h)
{$sel.width(w).height(h);};function refresh()
{var c=Coords.getFixed();Coords.setPressed([c.x,c.y]);Coords.setCurrent([c.x2,c.y2]);updateVisible();};function updateVisible()
{if(awake)return update();};function update()
{var c=Coords.getFixed();resize(c.w,c.h);moveto(c.x,c.y);options.drawBorders&&borders['right'].css({left:px(c.w-1)})&&borders['bottom'].css({top:px(c.h-1)});seehandles&&moveHandles(c);awake||show();options.onChange(unscale(c));};function show()
{$sel.show();$img.css('opacity',options.bgOpacity);awake=true;};function release()
{disableHandles();$sel.hide();$img.css('opacity',1);awake=false;};function showHandles()
{if(seehandles)
{moveHandles(Coords.getFixed());$hdl_holder.show();}};function enableHandles()
{seehandles=true;if(options.allowResize)
{moveHandles(Coords.getFixed());$hdl_holder.show();return true;}};function disableHandles()
{seehandles=false;$hdl_holder.hide();};function animMode(v)
{(animating=v)?disableHandles():enableHandles();};function done()
{animMode(false);refresh();};var $track=newTracker().mousedown(createDragger('move')).css({cursor:'move',position:'absolute',zIndex:360})
$img_holder.append($track);disableHandles();return{updateVisible:updateVisible,update:update,release:release,refresh:refresh,setCursor:function(cursor){$track.css('cursor',cursor);},enableHandles:enableHandles,enableOnly:function(){seehandles=true;},showHandles:showHandles,disableHandles:disableHandles,animMode:animMode,done:done};}();var Tracker=function()
{var onMove=function(){},onDone=function(){},trackDoc=options.trackDocument;if(!trackDoc)
{$trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp);}
function toFront()
{$trk.css({zIndex:450});if(trackDoc)
{$(document).mousemove(trackMove).mouseup(trackUp);}}
function toBack()
{$trk.css({zIndex:290});if(trackDoc)
{$(document).unbind('mousemove',trackMove).unbind('mouseup',trackUp);}}
function trackMove(e)
{onMove(mouseAbs(e));};function trackUp(e)
{e.preventDefault();e.stopPropagation();if(btndown)
{btndown=false;onDone(mouseAbs(e));options.onSelect(unscale(Coords.getFixed()));toBack();onMove=function(){};onDone=function(){};}
return false;};function activateHandlers(move,done)
{btndown=true;onMove=move;onDone=done;toFront();return false;};function setCursor(t){$trk.css('cursor',t);};$img.before($trk);return{activateHandlers:activateHandlers,setCursor:setCursor};}();var KeyManager=function()
{var $keymgr=$('<input type="radio" />').css({position:'absolute',left:'-30px'}).keypress(parseKey).blur(onBlur),$keywrap=$('<div />').css({position:'absolute',overflow:'hidden'}).append($keymgr);function watchKeys()
{if(options.keySupport)
{$keymgr.show();$keymgr.focus();}};function onBlur(e)
{$keymgr.hide();};function doNudge(e,x,y)
{if(options.allowMove){Coords.moveOffset([x,y]);Selection.updateVisible();};e.preventDefault();e.stopPropagation();};function parseKey(e)
{if(e.ctrlKey)return true;shift_down=e.shiftKey?true:false;var nudge=shift_down?10:1;switch(e.keyCode)
{case 37:doNudge(e,-nudge,0);break;case 39:doNudge(e,nudge,0);break;case 38:doNudge(e,0,-nudge);break;case 40:doNudge(e,0,nudge);break;case 27:Selection.release();break;case 9:return true;}
return nothing(e);};if(options.keySupport)$keywrap.insertBefore($img);return{watchKeys:watchKeys};}();function px(n){return''+parseInt(n)+'px';};function pct(n){return''+parseInt(n)+'%';};function cssClass(cl){return options.baseClass+'-'+cl;};function getPos(obj)
{var pos=$(obj).offset();return[pos.left,pos.top];};function mouseAbs(e)
{return[(e.pageX-docOffset[0]),(e.pageY-docOffset[1])];};function myCursor(type)
{if(type!=lastcurs)
{Tracker.setCursor(type);lastcurs=type;}};function startDragMode(mode,pos)
{docOffset=getPos($img);Tracker.setCursor(mode=='move'?mode:mode+'-resize');if(mode=='move')
return Tracker.activateHandlers(createMover(pos),doneSelect);var fc=Coords.getFixed();var opp=oppLockCorner(mode);var opc=Coords.getCorner(oppLockCorner(opp));Coords.setPressed(Coords.getCorner(opp));Coords.setCurrent(opc);Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect);};function dragmodeHandler(mode,f)
{return function(pos){if(!options.aspectRatio)switch(mode)
{case'e':pos[1]=f.y2;break;case'w':pos[1]=f.y2;break;case'n':pos[0]=f.x2;break;case's':pos[0]=f.x2;break;}
else switch(mode)
{case'e':pos[1]=f.y+1;break;case'w':pos[1]=f.y+1;break;case'n':pos[0]=f.x+1;break;case's':pos[0]=f.x+1;break;}
Coords.setCurrent(pos);Selection.update();};};function createMover(pos)
{var lloc=pos;KeyManager.watchKeys();return function(pos)
{Coords.moveOffset([pos[0]-lloc[0],pos[1]-lloc[1]]);lloc=pos;Selection.update();};};function oppLockCorner(ord)
{switch(ord)
{case'n':return'sw';case's':return'nw';case'e':return'nw';case'w':return'ne';case'ne':return'sw';case'nw':return'se';case'se':return'nw';case'sw':return'ne';};};function createDragger(ord)
{return function(e){if(options.disabled)return false;if((ord=='move')&&!options.allowMove)return false;btndown=true;startDragMode(ord,mouseAbs(e));e.stopPropagation();e.preventDefault();return false;};};function presize($obj,w,h)
{var nw=$obj.width(),nh=$obj.height();if((nw>w)&&w>0)
{nw=w;nh=(w/$obj.width())*$obj.height();}
if((nh>h)&&h>0)
{nh=h;nw=(h/$obj.height())*$obj.width();}
xscale=$obj.width()/nw;yscale=$obj.height()/nh;$obj.width(nw).height(nh);};function unscale(c)
{return{x:parseInt(c.x*xscale),y:parseInt(c.y*yscale),x2:parseInt(c.x2*xscale),y2:parseInt(c.y2*yscale),w:parseInt(c.w*xscale),h:parseInt(c.h*yscale)};};function doneSelect(pos)
{var c=Coords.getFixed();if(c.w>options.minSelect[0]&&c.h>options.minSelect[1])
{Selection.enableHandles();Selection.done();}
else
{Selection.release();}
Tracker.setCursor(options.allowSelect?'crosshair':'default');};function newSelection(e)
{if(options.disabled)return false;if(!options.allowSelect)return false;btndown=true;docOffset=getPos($img);Selection.disableHandles();myCursor('crosshair');var pos=mouseAbs(e);Coords.setPressed(pos);Tracker.activateHandlers(selectDrag,doneSelect);KeyManager.watchKeys();Selection.update();e.stopPropagation();e.preventDefault();return false;};function selectDrag(pos)
{Coords.setCurrent(pos);Selection.update();};function newTracker()
{var trk=$('<div></div>').addClass(cssClass('tracker'));$.browser.msie&&trk.css({opacity:0,backgroundColor:'white'});return trk;};function animateTo(a)
{var x1=a[0]/xscale,y1=a[1]/yscale,x2=a[2]/xscale,y2=a[3]/yscale;if(animating)return;var animto=Coords.flipCoords(x1,y1,x2,y2);var c=Coords.getFixed();var animat=initcr=[c.x,c.y,c.x2,c.y2];var interv=options.animationDelay;var x=animat[0];var y=animat[1];var x2=animat[2];var y2=animat[3];var ix1=animto[0]-initcr[0];var iy1=animto[1]-initcr[1];var ix2=animto[2]-initcr[2];var iy2=animto[3]-initcr[3];var pcent=0;var velocity=options.swingSpeed;Selection.animMode(true);var animator=function()
{return function()
{pcent+=(100-pcent)/velocity;animat[0]=x+((pcent/100)*ix1);animat[1]=y+((pcent/100)*iy1);animat[2]=x2+((pcent/100)*ix2);animat[3]=y2+((pcent/100)*iy2);if(pcent<100)animateStart();else Selection.done();if(pcent>=99.8)pcent=100;setSelectRaw(animat);};}();function animateStart()
{window.setTimeout(animator,interv);};animateStart();};function setSelect(rect)
{setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]);};function setSelectRaw(l)
{Coords.setPressed([l[0],l[1]]);Coords.setCurrent([l[2],l[3]]);Selection.update();};function setOptions(opt)
{if(typeof(opt)!='object')opt={};options=$.extend(options,opt);if(typeof(options.onChange)!=='function')
options.onChange=function(){};if(typeof(options.onSelect)!=='function')
options.onSelect=function(){};};function tellSelect()
{return unscale(Coords.getFixed());};function tellScaled()
{return Coords.getFixed();};function setOptionsNew(opt)
{setOptions(opt);interfaceUpdate();};function disableCrop()
{options.disabled=true;Selection.disableHandles();Selection.setCursor('default');Tracker.setCursor('default');};function enableCrop()
{options.disabled=false;interfaceUpdate();};function cancelCrop()
{Selection.done();Tracker.activateHandlers(null,null);};function destroy()
{$div.remove();$origimg.show();};function interfaceUpdate(alt)
{options.allowResize?alt?Selection.enableOnly():Selection.enableHandles():Selection.disableHandles();Tracker.setCursor(options.allowSelect?'crosshair':'default');Selection.setCursor(options.allowMove?'move':'default');$div.css('backgroundColor',options.bgColor);if('setSelect'in options){setSelect(opt.setSelect);Selection.done();delete(options.setSelect);}
if('trueSize'in options){xscale=options.trueSize[0]/boundx;yscale=options.trueSize[1]/boundy;}
xlimit=options.maxSize[0]||0;ylimit=options.maxSize[1]||0;xmin=options.minSize[0]||0;ymin=options.minSize[1]||0;if('outerImage'in options)
{$img.attr('src',options.outerImage);delete(options.outerImage);}
Selection.refresh();};$hdl_holder.hide();interfaceUpdate(true);var api={animateTo:animateTo,setSelect:setSelect,setOptions:setOptionsNew,tellSelect:tellSelect,tellScaled:tellScaled,disable:disableCrop,enable:enableCrop,cancel:cancelCrop,focus:KeyManager.watchKeys,getBounds:function(){return[boundx*xscale,boundy*yscale];},getWidgetSize:function(){return[boundx,boundy];},release:Selection.release,destroy:destroy};$origimg.data('Jcrop',api);return api;};$.fn.Jcrop=function(options)
{function attachWhenDone(from)
{var loadsrc=options.useImg||from.src;var img=new Image();img.onload=function(){$.Jcrop(from,options);};img.src=loadsrc;};if(typeof(options)!=='object')options={};this.each(function()
{if($(this).data('Jcrop'))
{if(options=='api')return $(this).data('Jcrop');else $(this).data('Jcrop').setOptions(options);}
else attachWhenDone(this);});return this;};})(jQuery);

/*
 * Jeditable - jQuery in place edit plugin
 *
 * Copyright (c) 2006-2009 Mika Tuupola, Dylan Verheul
 *
 * Licensed under the MIT license:
 *   http://www.opensource.org/licenses/mit-license.php
 *
 * Project home:
 *   http://www.appelsiini.net/projects/jeditable
 *
 * Based on editable by Dylan Verheul <dylan_at_dyve.net>:
 *    http://www.dyve.net/jquery/?editable
 */
(function($){$.fn.editable=function(target,options){if('disable'==target){$(this).data('disabled.editable',true);return;}
if('enable'==target){$(this).data('disabled.editable',false);return;}
if('destroy'==target){$(this).unbind($(this).data('event.editable')).removeData('disabled.editable').removeData('event.editable');return;}
var settings=$.extend({},$.fn.editable.defaults,{target:target},options);var plugin=$.editable.types[settings.type].plugin||function(){};var submit=$.editable.types[settings.type].submit||function(){};var buttons=$.editable.types[settings.type].buttons||$.editable.types['defaults'].buttons;var content=$.editable.types[settings.type].content||$.editable.types['defaults'].content;var element=$.editable.types[settings.type].element||$.editable.types['defaults'].element;var reset=$.editable.types[settings.type].reset||$.editable.types['defaults'].reset;var callback=settings.callback||function(){};var onedit=settings.onedit||function(){};var onsubmit=settings.onsubmit||function(){};var onreset=settings.onreset||function(){};var onerror=settings.onerror||reset;if(settings.tooltip){$(this).attr('title',settings.tooltip);}
settings.autowidth='auto'==settings.width;settings.autoheight='auto'==settings.height;return this.each(function(){var self=this;var savedwidth=$(self).width();var savedheight=$(self).height();$(this).data('event.editable',settings.event);if(!$.trim($(this).html())){$(this).html(settings.placeholder);}
$(this).bind(settings.event,function(e){if(true===$(this).data('disabled.editable')){return;}
if(self.editing){return;}
if(false===onedit.apply(this,[settings,self])){return;}
e.preventDefault();e.stopPropagation();if(settings.tooltip){$(self).removeAttr('title');}
if(0==$(self).width()){settings.width=savedwidth;settings.height=savedheight;}else{if(settings.width!='none'){settings.width=settings.autowidth?$(self).width():settings.width;}
if(settings.height!='none'){settings.height=settings.autoheight?$(self).height():settings.height;}}
if($(this).html().toLowerCase().replace(/(;|")/g,'')==settings.placeholder.toLowerCase().replace(/(;|")/g,'')){$(this).html('');}
self.editing=true;self.revert=$(self).html();$(self).html('');var form=$('<form />');if(settings.cssclass){if('inherit'==settings.cssclass){form.attr('class',$(self).attr('class'));}else{form.attr('class',settings.cssclass);}}
if(settings.style){if('inherit'==settings.style){form.attr('style',$(self).attr('style'));form.css('display',$(self).css('display'));}else{form.attr('style',settings.style);}}
var input=element.apply(form,[settings,self]);var input_content;if(settings.loadurl){var t=setTimeout(function(){input.disabled=true;content.apply(form,[settings.loadtext,settings,self]);},100);var loaddata={};loaddata[settings.id]=self.id;if($.isFunction(settings.loaddata)){$.extend(loaddata,settings.loaddata.apply(self,[self.revert,settings]));}else{$.extend(loaddata,settings.loaddata);}
$.ajax({type:settings.loadtype,url:settings.loadurl,data:loaddata,async:false,success:function(result){window.clearTimeout(t);input_content=result;input.disabled=false;}});}else if(settings.data){input_content=settings.data;if($.isFunction(settings.data)){input_content=settings.data.apply(self,[self.revert,settings]);}}else{input_content=self.revert;}
content.apply(form,[input_content,settings,self]);input.attr('name',settings.name);buttons.apply(form,[settings,self]);$(self).append(form);plugin.apply(form,[settings,self]);$(':input:visible:enabled:first',form).focus();if(settings.select){input.select();}
input.keydown(function(e){if(e.keyCode==27){e.preventDefault();reset.apply(form,[settings,self]);}});var t;if('cancel'==settings.onblur){input.blur(function(e){t=setTimeout(function(){reset.apply(form,[settings,self]);},500);});}else if('submit'==settings.onblur){input.blur(function(e){t=setTimeout(function(){form.submit();},200);});}else if($.isFunction(settings.onblur)){input.blur(function(e){settings.onblur.apply(self,[input.val(),settings]);});}else{input.blur(function(e){});}
form.submit(function(e){if(t){clearTimeout(t);}
e.preventDefault();if(false!==onsubmit.apply(form,[settings,self])){if(false!==submit.apply(form,[settings,self])){if($.isFunction(settings.target)){var str=settings.target.apply(self,[input.val(),settings]);$(self).html(str);self.editing=false;callback.apply(self,[self.innerHTML,settings]);if(!$.trim($(self).html())){$(self).html(settings.placeholder);}}else{var submitdata={};submitdata[settings.name]=input.val();submitdata[settings.id]=self.id;if($.isFunction(settings.submitdata)){$.extend(submitdata,settings.submitdata.apply(self,[self.revert,settings]));}else{$.extend(submitdata,settings.submitdata);}
if('PUT'==settings.method){submitdata['_method']='put';}
$(self).html(settings.indicator);var ajaxoptions={type:'POST',data:submitdata,dataType:'html',url:settings.target,success:function(result,status){if(ajaxoptions.dataType=='html'){$(self).html(result);}
self.editing=false;callback.apply(self,[result,settings]);if(!$.trim($(self).html())){$(self).html(settings.placeholder);}},error:function(xhr,status,error){onerror.apply(form,[settings,self,xhr]);}};$.extend(ajaxoptions,settings.ajaxoptions);$.ajax(ajaxoptions);}}}
$(self).attr('title',settings.tooltip);return false;});});this.reset=function(form){if(this.editing){if(false!==onreset.apply(form,[settings,self])){$(self).html(self.revert);self.editing=false;if(!$.trim($(self).html())){$(self).html(settings.placeholder);}
if(settings.tooltip){$(self).attr('title',settings.tooltip);}}}};});};$.editable={types:{defaults:{element:function(settings,original){var input=$('<input type="hidden"></input>');$(this).append(input);return(input);},content:function(string,settings,original){$(':input:first',this).val(string);},reset:function(settings,original){original.reset(this);},buttons:function(settings,original){var form=this;if(settings.submit){if(settings.submit.match(/>$/)){var submit=$(settings.submit).click(function(){if(submit.attr("type")!="submit"){form.submit();}});}else{var submit=$('<button type="submit" />');submit.html(settings.submit);}
$(this).append(submit);}
if(settings.cancel){if(settings.cancel.match(/>$/)){var cancel=$(settings.cancel);}else{var cancel=$('<button type="cancel" />');cancel.html(settings.cancel);}
$(this).append(cancel);$(cancel).click(function(event){if($.isFunction($.editable.types[settings.type].reset)){var reset=$.editable.types[settings.type].reset;}else{var reset=$.editable.types['defaults'].reset;}
reset.apply(form,[settings,original]);return false;});}}},text:{element:function(settings,original){var input=$('<input />');if(settings.width!='none'){input.width(settings.width);}
if(settings.height!='none'){input.height(settings.height);}
input.attr('autocomplete','off');$(this).append(input);return(input);}},textarea:{element:function(settings,original){var textarea=$('<textarea />');if(settings.rows){textarea.attr('rows',settings.rows);}else if(settings.height!="none"){textarea.height(settings.height);}
if(settings.cols){textarea.attr('cols',settings.cols);}else if(settings.width!="none"){textarea.width(settings.width);}
$(this).append(textarea);return(textarea);}},select:{element:function(settings,original){var select=$('<select />');$(this).append(select);return(select);},content:function(data,settings,original){if(String==data.constructor){eval('var json = '+data);}else{var json=data;}
for(var key in json){if(!json.hasOwnProperty(key)){continue;}
if('selected'==key){continue;}
var option=$('<option />').val(key).append(json[key]);$('select',this).append(option);}
$('select',this).children().each(function(){if($(this).val()==json['selected']||$(this).text()==$.trim(original.revert)){$(this).attr('selected','selected');}});}}},addInputType:function(name,input){$.editable.types[name]=input;}};$.fn.editable.defaults={name:'value',id:'id',type:'text',width:'auto',height:'auto',event:'click.editable',onblur:'cancel',loadtype:'GET',loadtext:'Loading...',placeholder:'Click to edit',loaddata:{},submitdata:{},ajaxoptions:{}};})(jQuery);

/*
 * jQuery Autocomplete plugin 1.1
 *
 * Copyright (c) 2009 Jörn Zaefferer
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
 */;(function($){$.fn.extend({autocomplete:function(urlOrData,options){var isUrl=typeof urlOrData=="string";options=$.extend({},$.Autocompleter.defaults,{url:isUrl?urlOrData:null,data:isUrl?null:urlOrData,delay:isUrl?$.Autocompleter.defaults.delay:10,max:options&&!options.scroll?10:150},options);options.highlight=options.highlight||function(value){return value;};options.formatMatch=options.formatMatch||options.formatItem;return this.each(function(){new $.Autocompleter(this,options);});},result:function(handler){return this.bind("result",handler);},search:function(handler){return this.trigger("search",[handler]);},flushCache:function(){return this.trigger("flushCache");},setOptions:function(options){return this.trigger("setOptions",[options]);},unautocomplete:function(){return this.trigger("unautocomplete");}});$.Autocompleter=function(input,options){var KEY={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8};var $input=$(input).attr("autocomplete","off").addClass(options.inputClass);var timeout;var previousValue="";var cache=$.Autocompleter.Cache(options);var hasFocus=0;var lastKeyPressCode;var config={mouseDownOnSelect:false};var select=$.Autocompleter.Select(options,input,selectCurrent,config);var blockSubmit;$.browser.opera&&$(input.form).bind("submit.autocomplete",function(){if(blockSubmit){blockSubmit=false;return false;}});$input.bind(($.browser.opera?"keypress":"keydown")+".autocomplete",function(event){hasFocus=1;lastKeyPressCode=event.keyCode;switch(event.keyCode){case KEY.UP:event.preventDefault();if(select.visible()){select.prev();}else{onChange(0,true);}break;case KEY.DOWN:event.preventDefault();if(select.visible()){select.next();}else{onChange(0,true);}break;case KEY.PAGEUP:event.preventDefault();if(select.visible()){select.pageUp();}else{onChange(0,true);}break;case KEY.PAGEDOWN:event.preventDefault();if(select.visible()){select.pageDown();}else{onChange(0,true);}break;case options.multiple&&$.trim(options.multipleSeparator)==","&&KEY.COMMA:case KEY.TAB:case KEY.RETURN:if(selectCurrent()){event.preventDefault();blockSubmit=true;return false;}break;case KEY.ESC:select.hide();break;default:clearTimeout(timeout);timeout=setTimeout(onChange,options.delay);break;}}).focus(function(){hasFocus++;}).blur(function(){hasFocus=0;if(!config.mouseDownOnSelect){hideResults();}}).click(function(){if(hasFocus++>1&&!select.visible()){onChange(0,true);}}).bind("search",function(){var fn=(arguments.length>1)?arguments[1]:null;function findValueCallback(q,data){var result;if(data&&data.length){for(var i=0;i<data.length;i++){if(data[i].result.toLowerCase()==q.toLowerCase()){result=data[i];break;}}}if(typeof fn=="function")fn(result);else $input.trigger("result",result&&[result.data,result.value]);}$.each(trimWords($input.val()),function(i,value){request(value,findValueCallback,findValueCallback);});}).bind("flushCache",function(){cache.flush();}).bind("setOptions",function(){$.extend(options,arguments[1]);if("data"in arguments[1])cache.populate();}).bind("unautocomplete",function(){select.unbind();$input.unbind();$(input.form).unbind(".autocomplete");});function selectCurrent(){var selected=select.selected();if(!selected)return false;var v=selected.result;previousValue=v;if(options.multiple){var words=trimWords($input.val());if(words.length>1){var seperator=options.multipleSeparator.length;var cursorAt=$(input).selection().start;var wordAt,progress=0;$.each(words,function(i,word){progress+=word.length;if(cursorAt<=progress){wordAt=i;return false;}progress+=seperator;});words[wordAt]=v;v=words.join(options.multipleSeparator);}v+=options.multipleSeparator;}$input.val(v);hideResultsNow();$input.trigger("result",[selected.data,selected.value]);return true;}function onChange(crap,skipPrevCheck){if(lastKeyPressCode==KEY.DEL){select.hide();return;}var currentValue=$input.val();if(!skipPrevCheck&&currentValue==previousValue)return;previousValue=currentValue;currentValue=lastWord(currentValue);if(currentValue.length>=options.minChars){$input.addClass(options.loadingClass);if(!options.matchCase)currentValue=currentValue.toLowerCase();request(currentValue,receiveData,hideResultsNow);}else{stopLoading();select.hide();}};function trimWords(value){if(!value)return[""];if(!options.multiple)return[$.trim(value)];return $.map(value.split(options.multipleSeparator),function(word){return $.trim(value).length?$.trim(word):null;});}function lastWord(value){if(!options.multiple)return value;var words=trimWords(value);if(words.length==1)return words[0];var cursorAt=$(input).selection().start;if(cursorAt==value.length){words=trimWords(value)}else{words=trimWords(value.replace(value.substring(cursorAt),""));}return words[words.length-1];}function autoFill(q,sValue){if(options.autoFill&&(lastWord($input.val()).toLowerCase()==q.toLowerCase())&&lastKeyPressCode!=KEY.BACKSPACE){$input.val($input.val()+sValue.substring(lastWord(previousValue).length));$(input).selection(previousValue.length,previousValue.length+sValue.length);}};function hideResults(){clearTimeout(timeout);timeout=setTimeout(hideResultsNow,200);};function hideResultsNow(){var wasVisible=select.visible();select.hide();clearTimeout(timeout);stopLoading();if(options.mustMatch){$input.search(function(result){if(!result){if(options.multiple){var words=trimWords($input.val()).slice(0,-1);$input.val(words.join(options.multipleSeparator)+(words.length?options.multipleSeparator:""));}else{$input.val("");$input.trigger("result",null);}}});}};function receiveData(q,data){if(data&&data.length&&hasFocus){stopLoading();select.display(data,q);autoFill(q,data[0].value);select.show();}else{hideResultsNow();}};function request(term,success,failure){if(!options.matchCase)term=term.toLowerCase();var data=cache.load(term);if(data&&data.length){success(term,data);}else if((typeof options.url=="string")&&(options.url.length>0)){var extraParams={timestamp:+new Date()};$.each(options.extraParams,function(key,param){extraParams[key]=typeof param=="function"?param():param;});$.ajax({mode:"abort",port:"autocomplete"+input.name,dataType:options.dataType,url:options.url,data:$.extend({q:lastWord(term),limit:options.max},extraParams),success:function(data){var parsed=options.parse&&options.parse(data)||parse(data);cache.add(term,parsed);success(term,parsed);}});}else{select.emptyList();failure(term);}};function parse(data){var parsed=[];var rows=data.split("\n");for(var i=0;i<rows.length;i++){var row=$.trim(rows[i]);if(row){row=row.split("|");parsed[parsed.length]={data:row,value:row[0],result:options.formatResult&&options.formatResult(row,row[0])||row[0]};}}return parsed;};function stopLoading(){$input.removeClass(options.loadingClass);};};$.Autocompleter.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",minChars:1,delay:400,matchCase:false,matchSubset:true,matchContains:false,cacheLength:10,max:100,mustMatch:false,extraParams:{},selectFirst:true,formatItem:function(row){return row[0];},formatMatch:null,autoFill:false,width:0,multiple:false,multipleSeparator:", ",highlight:function(value,term){return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"<strong>$1</strong>");},scroll:true,scrollHeight:180};$.Autocompleter.Cache=function(options){var data={};var length=0;function matchSubset(s,sub){if(!options.matchCase)s=s.toLowerCase();var i=s.indexOf(sub);if(options.matchContains=="word"){i=s.toLowerCase().search("\\b"+sub.toLowerCase());}if(i==-1)return false;return i==0||options.matchContains;};function add(q,value){if(length>options.cacheLength){flush();}if(!data[q]){length++;}data[q]=value;}function populate(){if(!options.data)return false;var stMatchSets={},nullData=0;if(!options.url)options.cacheLength=1;stMatchSets[""]=[];for(var i=0,ol=options.data.length;i<ol;i++){var rawValue=options.data[i];rawValue=(typeof rawValue=="string")?[rawValue]:rawValue;var value=options.formatMatch(rawValue,i+1,options.data.length);if(value===false)continue;var firstChar=value.charAt(0).toLowerCase();if(!stMatchSets[firstChar])stMatchSets[firstChar]=[];var row={value:value,data:rawValue,result:options.formatResult&&options.formatResult(rawValue)||value};stMatchSets[firstChar].push(row);if(nullData++<options.max){stMatchSets[""].push(row);}};$.each(stMatchSets,function(i,value){options.cacheLength++;add(i,value);});}setTimeout(populate,25);function flush(){data={};length=0;}return{flush:flush,add:add,populate:populate,load:function(q){if(!options.cacheLength||!length)return null;if(!options.url&&options.matchContains){var csub=[];for(var k in data){if(k.length>0){var c=data[k];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub.push(x);}});}}return csub;}else
if(data[q]){return data[q];}else
if(options.matchSubset){for(var i=q.length-1;i>=options.minChars;i--){var c=data[q.substr(0,i)];if(c){var csub=[];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub[csub.length]=x;}});return csub;}}}return null;}};};$.Autocompleter.Select=function(options,input,select,config){var CLASSES={ACTIVE:"ac_over"};var listItems,active=-1,data,term="",needsInit=true,element,list;function init(){if(!needsInit)return;element=$("<div/>").hide().addClass(options.resultsClass).css("position","absolute").appendTo(document.body);list=$("<ul/>").appendTo(element).mouseover(function(event){if(target(event).nodeName&&target(event).nodeName.toUpperCase()=='LI'){active=$("li",list).removeClass(CLASSES.ACTIVE).index(target(event));$(target(event)).addClass(CLASSES.ACTIVE);}}).click(function(event){$(target(event)).addClass(CLASSES.ACTIVE);select();input.focus();return false;}).mousedown(function(){config.mouseDownOnSelect=true;}).mouseup(function(){config.mouseDownOnSelect=false;});if(options.width>0)element.css("width",options.width);needsInit=false;}function target(event){var element=event.target;while(element&&element.tagName!="LI")element=element.parentNode;if(!element)return[];return element;}function moveSelect(step){listItems.slice(active,active+1).removeClass(CLASSES.ACTIVE);movePosition(step);var activeItem=listItems.slice(active,active+1).addClass(CLASSES.ACTIVE);if(options.scroll){var offset=0;listItems.slice(0,active).each(function(){offset+=this.offsetHeight;});if((offset+activeItem[0].offsetHeight-list.scrollTop())>list[0].clientHeight){list.scrollTop(offset+activeItem[0].offsetHeight-list.innerHeight());}else if(offset<list.scrollTop()){list.scrollTop(offset);}}};function movePosition(step){active+=step;if(active<0){active=listItems.size()-1;}else if(active>=listItems.size()){active=0;}}function limitNumberOfItems(available){return options.max&&options.max<available?options.max:available;}function fillList(){list.empty();var max=limitNumberOfItems(data.length);for(var i=0;i<max;i++){if(!data[i])continue;var formatted=options.formatItem(data[i].data,i+1,max,data[i].value,term);if(formatted===false)continue;var li=$("<li/>").html(options.highlight(formatted,term)).addClass(i%2==0?"ac_even":"ac_odd").appendTo(list)[0];$.data(li,"ac_data",data[i]);}listItems=list.find("li");if(options.selectFirst){listItems.slice(0,1).addClass(CLASSES.ACTIVE);active=0;}if($.fn.bgiframe)list.bgiframe();}return{display:function(d,q){init();data=d;term=q;fillList();},next:function(){moveSelect(1);},prev:function(){moveSelect(-1);},pageUp:function(){if(active!=0&&active-8<0){moveSelect(-active);}else{moveSelect(-8);}},pageDown:function(){if(active!=listItems.size()-1&&active+8>listItems.size()){moveSelect(listItems.size()-1-active);}else{moveSelect(8);}},hide:function(){element&&element.hide();listItems&&listItems.removeClass(CLASSES.ACTIVE);active=-1;},visible:function(){return element&&element.is(":visible");},current:function(){return this.visible()&&(listItems.filter("."+CLASSES.ACTIVE)[0]||options.selectFirst&&listItems[0]);},show:function(){var offset=$(input).offset();element.css({width:typeof options.width=="string"||options.width>0?options.width:$(input).width(),top:offset.top+input.offsetHeight,left:offset.left}).show();if(options.scroll){list.scrollTop(0);list.css({maxHeight:options.scrollHeight,overflow:'auto'});if($.browser.msie&&typeof document.body.style.maxHeight==="undefined"){var listHeight=0;listItems.each(function(){listHeight+=this.offsetHeight;});var scrollbarsVisible=listHeight>options.scrollHeight;list.css('height',scrollbarsVisible?options.scrollHeight:listHeight);if(!scrollbarsVisible){listItems.width(list.width()-parseInt(listItems.css("padding-left"))-parseInt(listItems.css("padding-right")));}}}},selected:function(){var selected=listItems&&listItems.filter("."+CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);return selected&&selected.length&&$.data(selected[0],"ac_data");},emptyList:function(){list&&list.empty();},unbind:function(){element&&element.remove();}};};$.fn.selection=function(start,end){if(start!==undefined){return this.each(function(){if(this.createTextRange){var selRange=this.createTextRange();if(end===undefined||start==end){selRange.move("character",start);selRange.select();}else{selRange.collapse(true);selRange.moveStart("character",start);selRange.moveEnd("character",end);selRange.select();}}else if(this.setSelectionRange){this.setSelectionRange(start,end);}else if(this.selectionStart){this.selectionStart=start;this.selectionEnd=end;}});}var field=this[0];if(field.createTextRange){var range=document.selection.createRange(),orig=field.value,teststring="<->",textLength=range.text.length;range.text=teststring;var caretAt=field.value.indexOf(teststring);field.value=orig;this.selection(caretAt,caretAt+textLength);return{start:caretAt,end:caretAt+textLength}}else if(field.selectionStart!==undefined){return{start:field.selectionStart,end:field.selectionEnd}}};})(jQuery);

/**
 * jQuery interface plugin
 *
 * Comportamientos de la interfaz del admin
 * @author Víctor Estévez Gómez <elia.gregorio@bittia.com>
 * @category javascript
 * @copyright Copyright © 2010, BITTIA - Grupo BITTIA
 * @filesource
 * @package javascript
 * @version 0.1
 */



(function($)

{

	$.fn.interFace = function(options)

	{
		options = options || {};
		//Enlaza interfaz con elementos relacionados

		return this.each(function()
		{      
			var node = this.nodeName.toLowerCase();

			if(node == 'a')
			{
				jQuery(this).unbind('click').bind('click', function(event)
				{
					event.preventDefault();
					//Distintos tipos de enlaces
					switch($(this).attr('class'))
					{
						//Borrar elemento con id igual a rev
						case 'delete':
							var el = $(this).attr('rev');

							//Elementos Borrar (class='delete')

							//Boxy.confirm($(this).attr('title'), function()
							//{
								$(el).slideUp('normal', function(){ $(el).remove(); });
							//});
							break;

							

						//Clonar elemento con id igual a rev, e incrementar +1 el id
						case 'clone':

							//Copiar el anterior o un id específico

							var clon;

							if($(this).attr('rev') == 'before')
							{
								clon = $($(this).prev()).clone(true);
							}
							else
							{
								clon = $('#'+$(this).attr('rev')).clone(true);
							}
							clon = $(clon);

							//Incrementa el id en 1 de los elementos necesarios
							var id = clon.attr('id').substring(0, clon.attr('id').lastIndexOf('_')+1);

							//
							var num = $($($(this).parent()).children('[id]:visible:last')).attr('id');//Número de elementos
							num = parseInt(num.substr(num.lastIndexOf('_')+1, num.length), 10) + 1;							



							if(id && num)
							{
								$(clon).attr('id', id+num);
								$(clon).css({'display': 'block'});

								//Deselecciona si tiene select

								if($('select', clon).length >= 1)
								{
									var selec = $($('select', clon)).attr('options')[$($('select', clon)).attr('selectedIndex')];
									$(selec).attr('selected', false);
									$('select', clon).attr('id', id+num);
								}												

								//Inputs text y Files
								if($(':file, :text', clon).length >= 1)
								{
									$(':file, :text', clon).each(function(it, el)
									{
										$(el).val('');
										$(el).attr('id', $(el).attr('id')+'_'+num);
										$(el).attr('disabled', '');
									});
								}

								//Labels con id nuevo si los hay
								if($('label', clon).length >= 1)
								{
									$('label', clon).each(function(it, el)
									{
										$(el).attr('for', $(el).attr('for')+'_'+num);
									});
								}



								//Quitar botón borrar si lo hay ya
								if($('a.delete', clon).length >= 1)
								{
									$('a.delete', clon).remove();
								}



								//Botón de borrar
								clon.append('<a rel="interface" rev="#'+id+num+'" class="delete" title="'+lng.del_quest_field+'">'+lng.del+'</a>');



								//Insertar
								if($($(this).prev()).css('display') == 'none')
								{
									clon.insertBefore($(this).prev());
								}
								else
								{
									clon.insertBefore(this);
								}

								//Comportamiento al enlace de borrar
								$('a[rev="#'+id+num+'"]').interFace();
							}
							break;

						

						default:
							//console.log('otro');
							break;

					}

					return false;

				});

			}

			else if(node == 'div')			

			{

				//Comparar con expresión regular

				if($(this).hasClass('image_n') || $(this).hasClass('multimedia_n'))

				{

					//Ordenar

					$('ul', this).sortable(

					{

						cursor: 'move',

						items: 'li',

						appendTo: 'body',

						opacity: 0.6,

						tolerance: 'pointer',

						placeholder: 'ui-state-highlight',

						stop: function(event, ui)

						{

							$(ui.item).css({'opacity': 1});

						}

					});

				}

			}

		});

		

	};

})(jQuery);//Call and execute the function immediately passing the jQuery object









/** 

 * Relation_list comportamiento

 */

(function($)

{

	$.fn.relationList = function(opt)

	{

		//Opciones

		opt = $.extend({},

		{

			path: INSTALATION_DIR+'/admin/ajax/relation_list.php',

			template: function(id, str)//applied to each item in datasource 

			{

				return "<option value='" + id + "'>" + str + "</option>";

			}

		}, opt);

	

		//Comportamiento

		return this.each(function()

		{

			//Contenedor general

			var source = $(this);



			//Lista elementos ordenable

			var list_items = $(this).find('.asmList');

			list_items.sortable(

			{

   				stop: function(event, ui) 

				{

					list_items.trigger('updateValues');

				}

			});

			

			//Actualizar el input con los valores

			list_items.bind('updateValues', function(event)

			{

				//Obtener valores para convertir a json

				var values = new Array();

				$.each($('li[rel]', list_items), function(num, value)

				{

					values[values.length] = $(value).attr('rel').split('-*-');

				});

				

				//Opciones seleccionadas como valor en el input

				$(list_items.next()).val(JSON.stringify(values));

			});

			

			//Editar elemento al doble click

			list_items.bind('dblclick', function(event)

			{

				var rel = (event.target.nodeName == 'LI')? $(event.target).attr('rel') : $(event.target).parents('li').attr('rel');//Obtener valores del select

				var vals = rel.split('-*-');//Separar valores

				//Rellenar campos

				$.each($(':input[type!="file"][name!="MAX_FILE_SIZE"]', $('.items', source)), function(num, el)

				{

					$(this).val(vals[num]);

				});

			});

			

			//Botón añadir elemento. Todos los valores de formularios los añade en nuevo item de lista

			$('a.new', source).live('click', function(event)

			{

				event.preventDefault();

				

				var $itemLabel = '';

				var sep = '';

				var ids = '';

				//Recorrer elementos para obtener ids y texto a mostrar

				$.each($(':input[type!="file"][type!="radio"][name!="MAX_FILE_SIZE"], :radio[checked]', $(this).parent()), function(num, el)

				{

					//Quitar [] en el nombre del campo

					var name = $(el).attr('name');

					if($(el).attr('name').substring($(el).attr('name').length-2, $(el).attr('name').length) == '[]')

					{

						name = $(el).attr('name').substring(0, $(el).attr('name').length-2);

					}

					

					//Texto e ids del elemento

					$itemLabel += "<span class='asmListItemLabel "+name+"'>"+(($(':selected', el).text())? $(':selected', el).text() : $(el).val())+"</span>";

					ids += sep+$(el).val();

					sep = '-*-';

				});



				//No existe elemento igual, añadir

				if($('[rel="'+ids+'"]', list_items).length < 1 && ids && ids != '0-*-0' && ids != '-*-' && ids != '00:00-*-')

				{

					//Enlace de borrar

					var $removeLink = $("<a href='#' class='asmListItemRemove'>"+lng.del+"</a>");

					//li para la lista con los textos y enlace

					var $item = $("<li rel='"+ids+"' class='asmListItem'></li>").append($itemLabel).append($removeLink);

					//Añadir elemento a la lista

					list_items.append($item);

					//Actualizar datos del input con valores

					list_items.trigger('updateValues');

				}

			});

			

			

			//Tipo archivo, subir por ajax

			//Selects relacionados

			var $selfuploads = $(':file', this);

			if($selfuploads.length > 0)

			{

				//Campos select asociados a otro

				new AjaxUpload('#'+$selfuploads.attr('id'),

				{

					action: INSTALATION_DIR+'/admin/ajax/upload_file.php',

					responseType: 'json',

					autoSubmit: true,

					onSubmit: function(file, ext)

					{

						loading(source);//Cargando

					},

					onComplete: function(file, response)		

					{

						loadingEnd();

						//Respuesta subida archivo

						if(response && response != 'error')

						{

							//Campo oculto para obtener valor

							$(this._button).before('<input id="aux_rl_upload" type="hidden" name="'+$(this._button).attr('name')+'" value="'+response.file_abs+'" />');

							//Añadir elemento

							$('a.new', source).trigger('click');

							//Borrar campo auxiliar

							$('#aux_rl_upload').remove();

						}

						else

						{

							//Reactivar campo

							Boxy.alert(lng.err_file_upload+' '+file, null, {title: 'Error'});

						}

					}

				});

			}

		

			//Selects relacionados

			var self = $(this).find('[rel] select');			

			//Campos select asociados a otro

			self.bind("change.relation_twice", function(event)

			{

				//Buscar en que posición está el elemento

				for(var i=0; i < self.length; i++)

				{

					if(self[i] == this)

						break;

				}

				

				loading(source);

				

				//Es el último, obtiene del anterior. Si no el siguiente

				var el = (i+1 == self.length)? i-1 : i+1;



				//Table, el class del select. Si hay varios class, el primero

				var table_source = $(self[i]).parents('div[rel][rev]').attr('rel');

				//Tabla relación, invertir si es último select

				var table_relation = $(self[i]).parents('div[rel][rev]').attr('rev');

				

				//Obtener elementos

				$.get(opt.path, {'relation': table_relation, 'source': table_source, 'id': $(self[i]).val()}, function(data, textStatus)

				{

					if(textStatus == 'success')

					{

						//Valor antiguo del select a actualizar

						var old_value = $(self[el]).val();

						//Vaciar opciones

						$(self[el]).empty();

						//Insertar nuevos elementos

						$.each(data, function(num, value)

						{

							//Añadir nuevas

							$(self[el]).append(opt.template(value[0], value[1]));//Añadir

						});

						//Selecciona el antiguo elemento seleccionado

						$("[value='"+old_value+"']", self[el]).attr("selected", true);

					}

					loadingEnd();

				}, 'json');

			});

			

			//Botones de borrar de la lista al editar

			$('.asmListItemRemove', source).live('click', function(event)

			{

				event.preventDefault();

				$(this).parent().slideUp('normal', function()

				{

					$(this).remove();

					list_items.trigger('updateValues');

				});

				

				return false;

			});

			

			source.css({'display': 'block'});

		});

	};

})(jQuery);//Call and execute the function immediately passing the jQuery object





/**
 * Javascript de la administración
 *
 * @category javascript
 * @copyright Copyright © 2010, BITTIA - Grupo BITTIA
 * @filesource
 * @package javascript
 * @version 2.0 2010/03/04
 */

/**
 * Ruta web de instalación. Constante
 */
var INSTALATION_DIR = $('link[rel="index"]').attr('href');
var selected_days = new Array(0);
var tp_loaded = false;


/**
 * Mostrar captura de un video
 */
function resultado_snapshot_video(imagen, error)
{
	Boxy.alert('<img src="'+INSTALATION_DIR+'/uploads/photos/99/'+imagen+'" width="300" />', null,
	{
		title: 'Capura de video'
	});
}


/**
 * Mostrar símbolo de carga 
 * @param e object Elemento al que superponer el cargador
 * @param opac floor Opacidad a aplicar. Por defecto 0.5
 * @param type string Tipo de posición de la capa, (absolute | fixed). Por defecto absolute
 */
function loading(e, opac, type)
{
	var opac = opac || '0.5';
	var lwidth = '100%';
	var lheight = $(window).height();
	var container = 'body';
	var ltop = lleft = 0;
	var lposition = 'fixed';
	//Ventana contenedora
	if(e == 'parent')//Contenedor
	{
		lwidth = '100%';
		lheight = '100%';
		container = window.parent.document.getElementById('content');		
	}
	else if(type == 'fixed')//Loading fijo
	{
		lwidth = $(e).outerWidth(true);
		lheight = $(e).outerHeight(true);
		container = e;
		ltop = $(e).offset().top;
		lleft = $(e).offset().left;
		lposition = 'fixed';
	}
	else if(e)//Posición absoluta
	{
		lwidth = $(e).outerWidth(false);
		lheight = $(e).outerHeight(false);
		container = e;
		ltop = (parseInt($(e).css('top')) > $(e).offset().top)? parseInt($(e).css('top')) : $(e).offset().top;
		lleft = (parseInt($(e).css('left')) > $(e).offset().left)? parseInt($(e).css('left')) : $(e).offset().left;
		lposition = 'absolute';
	}
	else//Toda la ventana
	{
		lwidth = '100%';
		lheight = $(window).height();
		container = window.document.getElementById('content');
	}

	//Crea loading si no existe
	if($('#loading').length < 1)
	{
		$('body').append('<div id="loading"></div>');
		$('#loading').css({opacity: opac, left: lleft, top: ltop, width: lwidth, height: lheight, position: lposition});
	}
	return true;
}
function loadingEnd()
{
	while($('#loading').length > 0)
	{
		$('#loading').remove();
	}
	return true;
}


/**
 * Remarcar un elemento
 */
function highlight(el)
{
	//Color de fondo original
	var aux_bg = $(el).css('backgroundColor');

	//Degradado de resaltado a color original
	$(el).css({'backgroundColor': '#FBFB8B'}).animate({'backgroundColor': aux_bg}, 'normal', function()
	{
		$(this).css({'backgroundColor': ''});
	});
}


/**
 * Cargar interFace con parámetros
 */
function loadIf()
{
	/**
	 * Elementos de interface
	 */
	$("[rel=interface]").interFace();

	/**
	 * Borrar valor en los campos de buscar
	 */
	$('#searcher input').live('focus', function(event)
	{
		$('#searcher input').val('');
	});
	
	/**
	 * Eventos de click generales
	 */
	$('body').die('click').live('click', function(event)
	{
		var $el = $(event.target);

		//Orden de los registros de una sección desde la página
		if($el.hasClass('order'))
		{
			event.preventDefault();
			loading();
			//Cambia el contenido viejo por el nuevo y activa javascript
			$('#content').load($(event.target).attr('href')+'show_full/ #content > *', {}, function()
			{
				loadingEnd();
			});
		}
		//Posición arriba y abajo por ajax
		else if($el.closest('.action_up, .action_down').length > 0)
		{
			event.preventDefault();
			var rel = $($el.closest('li[rel]')).attr('rel');//li movido			
			//Cambia el contenido viejo por el nuevo y activa javascript
			$('#content').load($el.attr('href')+'show_full/ #content > *', {}, function()
			{
				//Ocultar cartel
				$('div.info').hide();
				//Ocultar actions
				$('#show li[rel!="'+rel+'"] .row_actions').css({'visibility':'hidden'});
				//Remarcar fila movida
				highlight('#show li[rel="'+rel+'"]');			
			});
		}
		//Avisar de página en edición
		else if($el.closest('#header, #footer').length > 0 && $('#content[class!="boxy-content"] #add_edit').length > 0)
		{
			event.preventDefault();
			if(confirm('¿Está seguro de que quiere salir de esta página?\n\n'+
				'Tienes cambios sin guardar. Haz clic ahora en "Cancelar" y después en "Guardar" para guardarlos. Haz clic ahora en "Aceptar" para descartarlos.\n\n'+
				'Pulse Aceptar para continuar, o Cancelar para permanecer en la página actual.'))
			{
				document.location.href = $el.attr('href');
			}
		}
		//Enlaces externos
		else if($.inArray($el.closest("a").attr('rel'), ['nofollow', 'external']) > 0 || $el.closest("a").hasClass('view'))
		{
			event.preventDefault();
			window.open($el.closest("a").attr("href"));
		}
		//Password generado automáticamente
		else if($el.closest('#add_edit .password .random').length > 0)
		{
			event.preventDefault();
			var pass = $.password(10);
			alert('Contraseña: '+pass);
			$('#add_edit .password input').val(pass);
		}
	});

	/**
	 * Iconos de acciones ocultos, mostrar al hover
	 */
	$('#show .row_actions').css({'visibility':'hidden'});
	$('#show li[rel]').live('mouseenter', function()
	{
		$('.row_actions:first', this).css({'visibility':'visible'});
	});
	$('#show li[rel]').live('mouseleave', function()
	{
		$('.row_actions').css({'visibility':'hidden'});
	});

	/**
	 * Campos Edit Inline
	 */
	$('.edit_inline').editable(INSTALATION_DIR+'/admin/ajax/ajax_actions.php',
	{
		submitdata : function()//Parámetros a enviar
		{
			var parts = $(this).parent().attr('class').split(' ');
			return {
				action : 'inline_edit',
				input : parts[0],
				type : parts[1],
				id : $(this).parents('li[rel]').attr('rel')
			};
		},
		cancel : lng.cancel,
		cssclass : 'edit_inline_form',
		height: 'none',
		indicator : '<img src="'+INSTALATION_DIR+'/img/admin/spinner.gif"/>',
		onblur : 'ignore',
		placeholder : '',
		submit: lng.submit_data,
		tooltip : lng.click_edit,
		width : 'none'
	}).hover(function()//Hover, color de fondo
	{
		if($(this).children().length == 0)
			$(this).addClass('active');
	}, function()
	{
		$(this).removeClass('active');
		$('.edit_inline_form').css({'background-color':'transparent'});
	});
	//Editar elemento inline tipo bool
	$('.edit_inline_bool').live('click', function()
	{
		var eib_element = $(this);//Elemento
		//No está editándose
		if( ! eib_element.hasClass('editing'))
		{
			eib_element.addClass('editing');//Ahora sí
			
			//Click, cambiar a siguiente valor y enviar a db
			var posible_values = JSON.parse($(this).attr('rel'));//Posibles valores
			
			//Índice del actual (atributo rev)
			var selected = eib_element.attr('rev');
			var position = $.inArray(selected, posible_values);
			if(position >= 0)//Existe elemento, índice del siguiente (+1 o 1º)
			{
				position = (position+1 >= posible_values.length)? 0 : ++position;//Siguiente elemento o 1º si termina array
			}
			
			//Enviar a db
			$.post(INSTALATION_DIR+'/admin/ajax/ajax_actions.php',
			{
				action : 'inline_edit',
				input : $(this).parent().attr('class').split(' ')[0],
				type : 'bool',
				id : eib_element.parents('li[rel]').attr('rel'),
				value : posible_values[position]
			},
			function(data)
			{
				//Enviado, cambiar estilo elemento, cambiar dato mostrado, quitar cargador
				eib_element.removeClass('editing').removeClass(selected).addClass(posible_values[position]).attr('rev', posible_values[position]).text(data);
			});
		}
	});
	$('.edit_inline_bool').hover(function()//Hover, color de fondo
	{
		$(this).addClass('active').attr('title', lng.click_edit);
	}, function()
	{
		$(this).removeClass('active');
	});

	/**
	 * Árbol de elementos
	 */
	if($('#tree_elements').length > 0)
	{
		var simpleTree = $('.simpleTree');
		var simpleTreeCollection = simpleTree.simpleTree(
		{
			animate: false,
			autoclose: false,
			docToFolderConvert: true
		});

		//Mostrar acciones al hover en árbol
		$('li[rev]', simpleTree).live('mouseenter', function(event)
		{
			var class_item = $(event.target).attr('class');
			if(class_item != 'line' && class_item != 'line-last' && class_item != 'line-over')
			{
				$('.row_actions:first', this).css({'visibility': 'visible', 'display': 'block'});
			}	
		});
		$('li[rev]', simpleTree).live('mouseleave', function()
		{
			$('.row_actions').css({'visibility': 'hidden', 'display': 'none'});
		});
		
		//Guardar orden de elementos
		$('#order_save').bind('click', function(event)
		{
			event.preventDefault();
			loading('#content');
			//Elementos existentes
			var items = new Array();
			var items_total = $('ul[class!="row_actions"] > li[id]', simpleTree).length;
			//Recorrer li
			$('.simpleTree ul[class!="row_actions"] > li[id]').each(function(i, el)
			{
				items[i] = new Array($(el).attr('id'), $($(el).parents('li')).attr('id'), items_total--);
			});
			//Enviar array
			$.post(INSTALATION_DIR+'/admin/ajax/ajax_actions.php',
			{
				'action': 'tree_save',
				'section': $('body').attr('id'),
				'items': JSON.stringify(items)
			}, function(response, data)
			{
				loadingEnd();
				if(data == '"ok"')
				{
					alert('Posición guardada');
				}
			});
		});
		
		//Mostrar todos
		$('.view_all').bind('click', function(event)
		{
			event.preventDefault();
			//ul ocultos sin class mostrar
			$('ul:hidden', simpleTree).css({'display': 'block'});
			//Cambiar folder-close por folder-open
			$('.folder-close', simpleTree).removeClass('folder-close').addClass('folder-open');
			$('.folder-close-last', simpleTree).removeClass('folder-close-last').addClass('folder-open-last');
		});
		//Ocultar todos
		$('.hide_all').bind('click', function(event)
		{
			event.preventDefault();
			//ul ocultos sin class mostrar
			$('.root ul ul:visible[class!="row_actions"]', simpleTree).css({'display': 'none'});
			//Cambiar folder-close por folder-open
			$('.folder-open', simpleTree).removeClass('folder-open').addClass('folder-close');
			$('.folder-open-last', simpleTree).removeClass('folder-open-last').addClass('folder-close-last');
		});
	}

	/**
	 * Cargar tinymce
	 */
	if($('.tinymce:visible').length > 0)
	{
		$('textarea.tinymce:visible').tinymce(
		{
			script_url : INSTALATION_DIR+'/js/tiny_mce/tiny_mce.js',
			language : "es",
			theme : "advanced",
			button_tile_map : true,
			convert_fonts_to_spans : true,
			fix_list_elements : true,
			fix_table_elements : true,
			fix_nesting : true,
			plugins : "style,adminimage,adminmedia,media,advlink,inlinepopups,paste,xhtmlxtras",
			theme_advanced_buttons1 : "pastetext,undo,redo,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,bullist,numlist,outdent,indent,styleselect,formatselect,forecolor,|,link,unlink,|,adminmedia,|,sub,sup,abbr,acronym,|,removeformat,code",
			theme_advanced_buttons2 : "",
			theme_advanced_buttons3 : "",
			theme_advanced_toolbar_location : "top",
			theme_advanced_toolbar_align : "left",
			theme_advanced_statusbar_location : "bottom",
			theme_advanced_resizing : true,
			content_css : INSTALATION_DIR+"/css/reset.css,"+INSTALATION_DIR+"/css/styles.css",
			theme_advanced_styles : "Alineación derecha=right;Alineación izquierda=left,Introducción=intro",
			theme_advanced_blockformats : "p,h3,h4,h5,h6,blockquote,code,address,pre",
			width: "100%",
			theme_advanced_resize_horizontal : false,
			relative_urls : false,
			document_base_url : INSTALATION_DIR,
			inlinepopups_skin : 'admin',
			setup : function(ed) //Cargar mapa google si hay
			{
				ed.onInit.add(function(ed)
				{
					if($('#map_canvas').length > 0)
					{
						init_gmap();
					}
				});
			}
		});
	}
	//Cargar tinymce_table
	if($('.tinymce_table:visible').length > 0)
	{
		$('textarea.tinymce_table:visible').tinymce(
		{
			script_url : INSTALATION_DIR+'/js/tiny_mce/tiny_mce.js',
			language : "es",
			theme : "advanced",
			button_tile_map : true,
			convert_fonts_to_spans : true,
			fix_list_elements : true,
			fix_table_elements : true,
			apply_source_formatting : false,
			plugins : "style,adminimage,adminmedia,media,advlink,inlinepopups,paste,xhtmlxtras,table",
			//Theme options
			theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,|,forecolor,backcolor,|,link,unlink,anchor,|,charmap,adminmedia,image,|,styleprops",
			theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,bullist,numlist,|,outdent,indent,blockquote,|,sub,sup,|,undo,redo,|,code,cleanup,removeformat,|,cite,abbr,acronym,del,ins,attribs",
			theme_advanced_buttons3 : "tablecontrols",
			theme_advanced_toolbar_location : "top",
			theme_advanced_toolbar_align : "left",
			theme_advanced_statusbar_location : "bottom",
			theme_advanced_resizing : true,
			spellchecker_languages : "English=en,+Español=es,French=fr,Italian=it,Portuguese=pt",
			content_css : INSTALATION_DIR+"/css/reset.css,"+INSTALATION_DIR+"/css/styles.css",
			theme_advanced_styles : "Alineación derecha=right;Alineación izquierda=left,Introducción=intro",
			width: "100%",
			theme_advanced_resize_horizontal : false,
			relative_urls : false,
			document_base_url : INSTALATION_DIR,
			inlinepopups_skin : 'admin',
			setup : function(ed) //Cargar mapa google si hay
			{
				ed.onInit.add(function(ed) {
					if($('#map_canvas').length > 0)
					{
						init_gmap();
					}
				});
			}
		});
	}

	/**
	 * Relation_n
	 */
	if($(".relation_n select[multiple]:visible").length > 0)
	{
		//Carga selector múltiple visual
		$(".relation_n select[multiple]:visible").asmSelect({
			listType: 'ul',
			highlight: true,
			addItemTarget: 'top',
			sortable: true,
			removeLabel: lng.del,
			highlightAddedLabel: lng.added+': ',
			highlightRemovedLabel: lng.deleted+': '
		});
	}

	/**
	 * Relation list
	 */
	if($('div.relation_list').length > 0)
	{
		$('div.relation_list').relationList();
	}

	/**
	 * Campos permalink
	 */
	if($('div.permalink').length > 0)
	{
		$('div.permalink').each(function()
		{
			//Campo de permalink
			var $permalink = $('input', this);
			//Escribir letras
			$('#'+$(this).attr('rel')).bind('keyup', function(event)
			{
				var $permalink_source = $(this);//Origen para el permalink
				var value = $permalink_source.val().toLowerCase();
				value = value.replace(/(á|ä|à|â|å)/gi, 'a')
							 .replace(/(é|ë|è|ê|€)/gi, 'e')
							 .replace(/(í|ï|ì|î)/gi, 'i')
							 .replace(/(ó|ö|ò|ô)/gi, 'o')
							 .replace(/(ú|ü|ù|û)/gi, 'u')
							 .replace(/ñ/gi, 'n')
							 .replace(/ç/gi, 'c')
							 .replace(/ /gi, '-')
							 .replace(/[^%a-z0-9_-]/gi, '');
				$permalink.val(value);
			});
		});
	}

	/**
	 * Tooltips
	 */
	$("label:has('ul'), h3:has('ul'), h4:has('ul')").tooltip(
	{
		top: 14,
		left: 10,
		track: true,
		delay: 0,
		bodyHandler: function()
		{
			return $(this).parent('div,fieldset,h3,h4').find('.text:first').clone();
		}
	});

	/**
	 * Ajax upload de imagen
	 */
	if($('.fields .image').length > 0)
	{
		//Campo a aplicar subida ajax y crop
		var input = $('.fields .image :file').attr('id');
		new AjaxUpload('#'+input,
		{
			action: INSTALATION_DIR+'/admin/ajax/ajax_actions.php',
			responseType: 'json',
			data:
			{
				action : 'upload_multimedia'
			},
			onSubmit: function(file, ext)
			{
				//Comprobar tipo de archivo
				if( ! (ext && /^(jpg|jpeg|png|gif)$/.test(ext.toLowerCase()) ))
				{
					Boxy.alert(lng.err_img_format, null, {title: 'Error'});
					return false;
				}
				
				//Cargando mientras sube
				loading($(this._button).parents('.image'));
				//Deshabilitar botón de enviar
				$('#add_edit').live('submit', function(event)
				{
					event.preventDefault();
				});
			},
			onComplete: function(file, response)		
			{
				//Hay respuesta no error y se puede parsear el resultado
				if(response && response != 'error')
				{
					//Borrar anterior imagen a recortar
					$('#jcrop_container').remove();
		
					//Añadir imagen y campo con dimensiones
					$(this._button).parents('fieldset:first').append('<div id="jcrop_container"><img src="'+INSTALATION_DIR+'/uploads/photos/99/'+response.img+'" id="cropbox" /><input value=\'{"x":0,"y":0,"w":'+response[0]+',"h":'+response[1]+'}\' id="'+input+'_crop" name="'+input+'_crop" type="hidden"/><input type="hidden" value="'+response.img_abs+'" id="'+input+'_url" name="'+input+'_url"/></div>');

					//Crop imagen
					jQuery('#cropbox').Jcrop(
					{
						onSelect: function(c)//Tamaño recorte en campo oculto
						{
							$('#'+input+'_crop').val(JSON.stringify(c));
						},
						trueSize: [response[0], response[1]] //Tamaño real de imagen
					});
				}
				else
				{
					Boxy.alert(lng.err_img_upload, null, {title: 'Error'});
				}
				loadingEnd();
				$('#add_edit').die('submit');
			}
		});
	}

	/**
	 * Ajax upload video. SOBRA?
	 */
	if($('.fields .video').length > 0)
	{
		//Campo a aplicar subida ajax y crop
		var input_video = $('.fields .video :file').attr('id');
		new AjaxUpload('#'+input_video,
		{
			action: INSTALATION_DIR+'/admin/ajax/upload_file.php',
			responseType: 'json',
			onSubmit: function(file, ext)
			{
				//Comprobar tipo de archivo
				if( ! (ext && /^(flv|mov)$/.test(ext.toLowerCase())))
				{
					Boxy.alert(lng.err_video_format, null, {title: 'Error'});
					return false;
				}
				//Cargando mientras sube
				loading();
				//Deshabilitar botón de enviar
				$('#add_edit').live('submit', function(event)
				{
					event.preventDefault();
				});
			},
			onComplete: function(file, response)		
			{
				//Hay respuesta no error y se puede parsear el resultado
				if(response && response != 'error')
				{
					//Borrar anterior archivo subido
					$('#'+input+'_element, #video_chapters').remove();
					//Añadir video en reproductor
					$(this._button).parents('fieldset:first').append('<div id="'+input_video+'_element" class="element">'+
																	 '<object id="player_api" height="417" width="512" type="application/x-shockwave-flash" data="'+INSTALATION_DIR+'/img/admin/flowplayer-3.1.5.swf">'+
																	 '<param value="true" name="allowfullscreen"/>'+
																	 '<param value="always" name="allowscriptaccess"/>'+
																	 '<param value="high" name="quality"/>'+
																	 '<param value="#000000" name="bgcolor"/>'+
																	 '<param name="wmode" value="transparent"></param>'+
																	 '<param value="video='+response.file+'" name="flashvars"/>'+
																	 '</object>'+
																	 '<input value="'+response.file+'" id="'+input_video+'_url" name="'+input_video+'_url" type="hidden"/></div>');
				}
				else
				{
					Boxy.alert(lng.err_video_upload, null, {title: 'Error'});
				}
						
				loadingEnd();
				$('#add_edit').die('submit');
			}
		});
	}

	/**
	 * Ajax upload de elemento multimedia
	 */
	if($('.fields .multimedia').length > 0)
	{
		//Campo a aplicar subida ajax y crop
		var input = $('.fields .multimedia  :file').attr('id');

		//Subir por ajax el archivo
		new AjaxUpload('#'+input,
		{
			action: INSTALATION_DIR+'/admin/ajax/ajax_actions.php',
			responseType: 'json',
			data:
			{
				action : 'upload_multimedia'
			},
			onSubmit: function(file, ext)
			{
				//Comprobar tipo de archivo
				if( ! (ext && /^(jpg|png|jpeg|gif|swf|flv|mp3|doc|docx|pdf|zip|rar)$/.test(ext.toLowerCase())))
				{
					Boxy.alert(lng.err_file_format, null, {title: 'Error'});
					return false;
				}

				//Cargando mientras sube
				loading($(this._button).parents('.multimedia'));
				//Deshabilitar botón de enviar
				$('#add_edit').live('submit', function(event)
				{
					event.preventDefault();
				});
			},
			onComplete: function(file, response)		
			{
				//Borrar anterior elemento subido
				$('#'+input+'_container').remove();
				$('#'+input+'_url').val('');
				
				//Hay respuesta no error y se puede parsear el resultado
				if(response && response != 'error')
				{
					//Imagen subida
					if(response.img && response.img_abs)
					{
						//Añadir imagen y campo con dimensiones
						$(this._button).parents('fieldset:first').after('<div id="'+input+'_container"><div id="jcrop_container"><img src="'+INSTALATION_DIR+'/uploads/photos/99/'+response.img+'" id="cropbox" /><input value=\'{"x":0,"y":0,"w":'+response[0]+',"h":'+response[1]+'}\' id="'+input+'_crop" name="'+input+'_crop" type="hidden"/><input type="hidden" value="'+response.img_abs+'" id="'+input+'_url" name="'+input+'_url"/></div></div>');
	
						//Crop imagen
						jQuery('#cropbox').Jcrop(
						{
							onSelect: function(c)//Tamaño recorte en campo oculto
							{
								$('#'+input+'_crop').val(JSON.stringify(c));
							},
							trueSize: [response[0], response[1]] //Tamaño real de imagen
						});
					}
					//Vídeo subido
					else if(response.video && response.video_abs)
					{
						//Añadir video en reproductor
						$(this._button).parents('fieldset:first').after('<div id="'+input+'_container" class="element">'+
																	 '<object id="player_api" height="417" width="512" type="application/x-shockwave-flash" data="'+INSTALATION_DIR+'/img/admin/flowplayer-3.1.5.swf">'+
																	 '<param value="true" name="allowfullscreen"/>'+
																	 '<param value="always" name="allowscriptaccess"/>'+
																	 '<param value="high" name="quality"/>'+
																	 '<param value="#000000" name="bgcolor"/>'+
																	 '<param name="wmode" value="transparent"></param>'+
																	 '<param value="video='+response.video+'" name="flashvars"/>'+
																	 '</object>'+
																	 '<input value="'+response.video_abs+'" id="'+input+'_url" name="'+input+'_url" type="hidden" class="hidden"/></div>');
					}
					//Otro archivo, enlace
					else 
					{
						var ext = response.file.split('.').pop();
						//Mostrar enlace al archivo subido
						$(this._button).parents('fieldset:first').after('<div id="'+input+'_container"><input class="hidden" type="hidden" value="'+response.file_abs+'" id="'+input+'_url" name="'+input+'_url"/><a class="'+ext+'" href="'+response.file_abs+'" rel="external" title="">Archivo '+response.file+'</a></div>');
					}
				}
				else
				{
					Boxy.alert(lng.err_img_upload, null, {title: 'Error'});
				}
				loadingEnd();
				$('#add_edit').die('submit');
			}
		});
		
		//Editar imagen, crop imagen
		$('#jcrop_container img').load(function()
		{
			jQuery('#cropbox').Jcrop(
			{			
				onSelect: function(c)//Tamaño recorte en campo oculto
				{
					$('#'+input+'_crop').val(JSON.stringify(c));
				},
				trueSize: [$('#cropbox').width(), $('#cropbox').height()] //Tamaño real de imagen
			});
		});
	}

	/**
	 * Subir archivo a través de Ajax Upload
	 */
	if($('.uploadbatch').length > 0)
	{
		//Cargar Ajax Upload
		function ajaxUploadId(id)
		{
			new AjaxUpload('#'+id,
			{
				action: INSTALATION_DIR+'/admin/ajax/upload_file.php',
				responseType: 'json',
				autoSubmit: true,
				onSubmit: function(file, ext)
				{
					//Comprobar tipo de archivo
					if( ! (ext && /^(jpg|png|jpeg|gif|swf|flv|mp3|doc|docx|pdf|zip|rar)$/.test(ext.toLowerCase()) ))
					{
						Boxy.alert(lng.err_file_format, null, {title: 'Error'});
						return false;
					}
					
					//Desactivar botón y poner como subiendo
					$(this._button).attr('disabled', 'disabled').css({'opacity': 0.7});
					$($(this._button).parents('.item')).css({'background-image': 'url('+INSTALATION_DIR+'/img/admin/lightbox-ico-loading.gif)'});

					//Añadir otro input
					$('.uploadbatch .clone').trigger('click');
				},
				onComplete: function(file, response)		
				{
					//Quitar fondo
					$($(this._button).parents('.item')).css({'background-image': ''});

					//Respuesta subida archivo
					if(response && response != 'error')
					{
						//Mostrar archivo subido y quitar campo input
						$(this._button).before('<div class="uploaded">Subido <span><a href="'+response.file_abs+'" target="_blank">'+file+'</a></span></div><input type="hidden" name="'+$(this._button).attr('name')+'" value="'+response.file_abs+'"/>').remove();
					}
					else
					{
						//Reactivar campo y mensaje de error
						Boxy.alert(lng.err_file_upload+' '+file, null, {title: 'Error'});
						$(this._button).attr('disabled', '');
					}
				}
			});
		}

		//Primer campo
		ajaxUploadId($(':file:first').attr('id'));
		//Campos clonados, funcionalidad ajax upload al último elemento creado
		$('.uploadbatch .clone').bind('click', function(event)
		{
			ajaxUploadId($('.fields div.item:visible:last :file').attr('id'));
		});
		
		//Mostrar campos tras cargar todo
		$('#add_edit').css({'display':'block'});
	}

	/**
	 * Tags
	 */
	if($('.tags input').length > 0)
	{
		//Autocompletador de etiquetas existentes
		var input_tags = $(".tags input[type='text']").attr('name')
		var field_tags = input_tags.replace('_input', '');
		var $fl_tags = $($('#'+field_tags).parents('.facelist'));
		$("#"+input_tags).autocomplete(INSTALATION_DIR+"/admin/ajax/ajax_actions.php",
		{
			extraParams:
			{
				'action': 'tag_get'
			},
			matchContains: true,
			minChars: 2,
			selectFirst: false,
			cacheLength: 10,
			delay: 400
		}).result(function(event, item)
		{
			//Añadir a listado de etiquetas
			if($('li[id="bit-'+item[1]+'"]', $fl_tags).length <= 0)
			{
				//Actualizar ids de elementos seleccionados
				var values_input = '';
				$('li[id]', $fl_tags).each(function()
				{
					values_input += $(this).attr('id').split('-')[1]+',';
				});
				//Campo oculto con ids
				$('#'+field_tags).val(values_input+item[1]+',');
				$('.token-input', $fl_tags).before('<li id="bit-'+item[1]+'" class="token"><span><span><span><span>'+item[0]+'</span></span></span></span><span class="x"> .x</span></li>');
			}
			//Vaciar input buscador
			$('#'+input_tags).val('');
		});
		
		//Borrado de tokens en campos tags
		$('.token .x', $fl_tags).live('click', function(event)
		{
			var $li = $($(this).parent());
			//Borrado del valor en input
			var values = $('#'+field_tags).val().split($li.attr('id').split('-')[1]+',');
			$('#'+field_tags).val(values.join(''));
			//Quitar token
			$li.remove();
		});
		
		//Añadir etiquetas pulsando
		$(".tags input").live('keydown', function(event)
		{
			//Pulsar intro, añadir opción
			if(event.keyCode == 13)
			{
				event.preventDefault();
				var txt = $(event.target).val();
				if(txt)//Existe texto de tag
				{
					$(event.target).attr('disabled', 'disabled');
					//Añadir tag por ajax
					$.get(INSTALATION_DIR+"/admin/ajax/ajax_actions.php", {q: txt, 'action':'tag_add'}, function(data)
					{
						if(data == -1)
						{
							$(event.target).removeAttr('disabled');
							return;
						}
						//Ids de tags
						var to_user = $('#'+field_tags);
						//No está seleccionada
						if(to_user.val().search(data+',') < 0)
						{
							//Añadir opción
							elemLI = $('<li id="bit-'+data+'" class="token"><span><span><span><span>'+txt+'</span></span></span></span></li>').click(function()
							{
								$('.token').removeClass('token_selected');
								$(this).addClass("token_selected");
							}, function(){ $(this).removeClass("token_selected");});
							//Botón borrar
							elemA = $('<span class="x"> .x</span>').click(function()
							{
								$('#bit-'+data).remove();
								//var dat = ;
								$(to_user).val(to_user.val().replace(data+',', ''));
								return false;
							});
							$(elemLI).append(elemA);
							$('#result_list ul').remove();
							$('.token-input').before(elemLI);
							to_user.val(to_user.val()+data+',');//Id elemento en lista
							$(event.target).val('');
							$('.tags input[autocomplete]').focus();
						}
						$(event.target).removeAttr('disabled');
					});
				}
			}
		});
	}

	/**
	 * Relation_n tags
	 */
	if($('.relation_n .asmTagsContainer').length > 0)
	{
		//Autocompletador de etiquetas existentes
		var input_rn = $(".relation_n .asmTagsContainer input[type='text']").attr('id');
		var $fl_rn = $($('#'+input_rn).parents('.asmTagsContainer'));
		var values_rn = JSON.parse($('#'+input_rn).attr('accept'));
		$("#"+input_rn).autocomplete(INSTALATION_DIR+"/admin/ajax/ajax_actions.php", 
		{ 
			extraParams:
			{
				action: 'relation_n_tags',
				field: values_rn.table_source,
				id: values_rn.id,
				'show[]': values_rn.show
			},
			matchContains: true,
			minChars: 1,
			selectFirst: false,
			cacheLength: 20,
			delay: 400
		}).result(function(event, item)
		{
			//Añadir a listado de etiquetas si no existe
			if($('li[id="bit-'+item[1]+'"]', $fl_rn).length <= 0)
			{
				$('.asmList', $fl_rn).prepend('<li id="bit-'+item[1]+'" class="asmListItem">'+
											'<span class="asmListItemLabel">'+item[0]+'</span>'+
											'<a href="#" class="asmListItemRemove">Borrar</a>'+
											'<input type="hidden" name="'+input_rn.replace('_input', '')+'[]" value="'+item[1]+'"/></li>');
				highlight('.asmTagsContainer #bit-'+item[1]);
			}
			//Vaciar input buscador
			$('#'+input_rn).val('');
		});
		
		//Borrado de tokens en campos tags
		$('.asmListItemRemove', $fl_rn).live('click', function(event)
		{
			event.preventDefault();
			$($(this).closest("li")).remove();//Quitar token
		});
	}
}


/**
 * Cargar lightbox con parámetros 
 */
function loadLb()
{
	$('a[rel*=lightbox]').lightBox(
	{
		imageLoading: INSTALATION_DIR+'/img/admin/lightbox-ico-loading.gif',
		imageBtnClose: INSTALATION_DIR+'/img/admin/lightbox-btn-close.gif',
		imageBtnPrev: INSTALATION_DIR+'/img/admin/lightbox-btn-prev.gif',
		imageBtnNext: INSTALATION_DIR+'/img/admin/lightbox-btn-next.gif',
		imageBlank: INSTALATION_DIR+'/img/admin/lightbox-blank.gif',
		containerResizeSpeed: 250,
		txtImage: lng.image,
		txtOf: lng.of,
		keyToPrev: lng.lightbox_prev,
		keyToNext: lng.lightbox_next
	});
}


/**
 * Carga User Interface de jquery
 */
function loadUI()
{
	var d = new Date().getFullYear()+2;
	//Fecha
	$('input.date_picker').datepicker({
		yearRange: "1800:"+d,
		firstDay: 1,
		dateFormat: 'd-m-yy',
		clearText: lng.clear,
		clearStatus: '',
		closeText: lng.close,
		closeStatus: '',
		prevText: lng.prev,
		prevStatus: '',
		nextText: lng.next,
		nextStatus: '',
		currentText: lng.today,
		currentStatus: '',
		monthNames: lng.months,
		monthNamesShort: lng.months_short,
		weekHeader: 'Sm',
		dayNames: lng.days,
		dayNamesShort: lng.days_short,
		dayNamesMin: lng.days_min,
		dayStatus: 'DD',
		changeMonth: true,
		changeYear: true
	});	

	//Fecha con múltiples días seleccionados
	$('.time_n > div[id!=dp]').datepicker({
		yearRange: "1800:"+d,
		firstDay: 1,
		dateFormat: 'd-m-yy',
		clearText: lng.clear,
		clearStatus: '',
		closeText: lng.close,
		closeStatus: '',
		prevText: lng.prev,
		prevStatus: '',
		nextText: lng.next,
		nextStatus: '',
		currentText: lng.today,
		currentStatus: '',
		monthNames: lng.months,
		monthNamesShort: lng.months_short,
		weekHeader: 'Sm',
		dayNames: lng.days,
		dayNamesShort: lng.days_short,
		dayNamesMin: lng.days_min,
		dayStatus: 'DD',
		changeMonth: true,
		changeYear: true,
		onSelect: function(date, dp)//Seleccionar día, añade a la lista
		{
			for(var i=0; selected_days && i < selected_days.length; i++)
			{
				//Fecha coincide con algun día, lo borra de la lista
				if(dp.selectedYear == selected_days[i][0] && dp.selectedMonth+1 == selected_days[i][1] && dp.selectedDay == selected_days[i][2])
				{
					selected_days.splice(i,1);
					$(this).children('input')[0].value = JSON.stringify(selected_days);
					return true;
				}
			}
			//No está en lista, añade y actualiza campo
			selected_days[selected_days.length] = new Array(dp.selectedYear, dp.selectedMonth+1, dp.selectedDay);
			if($(this).children('input').length > 0)
			{
				$(this).children('input')[0].value = JSON.stringify(selected_days);
			}
			return true;
		},
		beforeShowDay: function(date)//Marca los días seleccionados en el input
		{
			if(selected_days.length === 0)
			{
				if($(this).children('input').length > 0 && $(this).children('input')[0].value)
				{
					selected_days = JSON.parse($(this).children('input')[0].value);
				}
			}
			for(var i=0; selected_days && i < selected_days.length; i++)
			{
				//Fecha coincide con algun día
				if(date.getFullYear() == selected_days[i][0] && date.getMonth()+1 == selected_days[i][1] && date.getDate() == selected_days[i][2])
				{
					return [true, 'selected'];
				}
			}
			return [true, ''];//Dia habilitado sin seleccionar
		}
	});

	//Hora
	if($("input.time_picker").length >= 1)
	{
		tp_loaded = false;
		if( ! tp_loaded)//JS y CSS de clockpick no cargado
		{
			$("input.time_picker").clockpick({
				starthour : 0,
				endhour : 23,
				showminutes : true,
				minutedivisions : 12,
				military : true			
			});
			tp_loaded = true;
		}
		else //Archivos cargados, solo inicializar campos
		{
			$("input.time_picker").clockpick({
				starthour : 0,
				endhour : 23,
				showminutes : true,
				minutedivisions : 12,
				military : true			
			});			
		}
	}
	
	/**
	 * Debug
	 */
	$("#debug").draggable(
	{
		handle: 'h4'
	});
	$("#debug").live('dblclick', function()
	{
		$("#debug").toggleClass('minimized');
		$("#debug .text").toggleClass('hidden');
	});
}


/**
 * Cargar ventanas comportamiento con parámetros 
 */
function loadBoxy()
{
	var url_data = window.document.location; //Url a cargar
	var url_aux = window.document.location; //Url actual

	/**
	 * Cerrar todos los boxys al pulsar ESC
	 */
	$(window).keydown(function(event)
	{
		if(event.keyCode == 27)
		{
			$('.boxy-wrapper, .boxy-modal-blackout').fadeOut('fast', function()
			{
				$(this).remove();
				loadingEnd();
			});
		}
	});

	/**
	 * Boxy para relation_n, controla el formulario
	 */
	$("[rel='boxy']").live('click', function(event)
	{
		loading('body');
		event.preventDefault();
		event.target = $(event.target).closest('a');//El primer enlace válido (o propio elemento)

		//Crear boxy
		Boxy.load($(event.target).attr('href')+'show_full/',
		{
			title: $(event.target).attr('title'),
			closeText: lng.close_boxy,
			modal: true,
			actuator: $(event.target),
			unloadOnHide: true,
			afterHide: function()//Tras ocultar, restaurar url de carga de datos
			{
				url_data = window.document.location;
			},
			afterShow: function()//Tras mostrar
			{
				//Ventana creada dentro de un boxy, como ruta de vuelta la referencia
				if($(event.target).closest('boxy-content').length > 0)
				{
					url_data = url_aux;
				}
				else if(url_aux == window.document.location)//Ventana original, url aux para futuras a ella misma
				{
					url_aux = this.options.actuator.attr('href');//Ruta de llamada la nuevo boxy
				}

				//Session timeout, mostrar formulario de login
				if($('#login_footer').length > 0)
				{
					alert('La sesión ha terminado. Por favor, vuelva a identificarse');
					window.document.location.href = INSTALATION_DIR+'/admin/';
				}
				
				//Focus en primer input
				$('.boxy-content input[type="text"]').focus();

				//Cargar UI
				loadUI();
				loadIf();
			},
			behaviours: function(r) //Tras cambiar contenido
			{
				loadingEnd();
				var boxy_element = this;//Mantener el objeto boxy para llamadas siguientes

				//Session timeout, mostrar formulario completo
				if($('#login', boxy_element).length > 0)
				{
					$(window.document).html(r);
					return false;
				}

				//Enlaces deshabilitados
				$('a', r).click(function(e)
				{
					e.preventDefault();
				});

				//Pregunta, cerrar al click
				$('#question a', r).click(function(event)
				{
					$('#content').load($(event.target).attr('href')+' #content > *');
					boxy_element.hide();
				});
				
				//Action del form, llamada ajax. Mirar resultado
				$('form', r).unbind('submit.bif').bind('submit.bif', function handler(event)
				{
					event.preventDefault();
					loading('.boxy-wrapper', 0.5, 'fixed');//Cargando
					
					$.post($(event.target).attr('action')+'show_full/', $(event.target).serialize(), function(text, status)
					{
						//Estado de la llamada ajax
						if(status == 'success')
						{
							//Tipo del mensaje de aviso
							switch($("div:first", text).attr('class'))
							{
								//Resultado correcto, cerrar cuadro y recargar web parent
								case 'info':
									//Mensaje éxito
									boxy_element.setContent($(text).find("div:first"));
									
									var id_element = $(boxy_element.options.actuator).parent().attr('id');
									//Si elemento por encima 2 posiciones tiene id es formulario, cambiar solo esa parte
									if(id_element.toString().length > 2)
									{
										//Es un select, carga los options uno a uno
										if($('#'+id_element).hasClass('relation_n'))
										{
											loading('.boxy-wrapper', 0.5, 'fixed');//Cargar
											//Obtener nuevo select para añadir los nuevos option
											$.get(url_data+'show_full/', function(text, status)
											{
												//Opciones existentes en el array
												var arr = new Array();
												var i = 0;
												//Seleccionar multiple o no
												if($('#'+id_element, text).hasClass('multiple_no'))
												{
													var item_selector = '#'+id_element+' select option';
												}
												else
												{
													var item_selector = '#'+id_element+' select[multiple] option';
												}
												//Obtener elementos
												$(item_selector).each(function()
												{
													arr[i++] = '-'+this.value+this.text;
												})
												var arr2str = arr.toString();

												//Selector en el archivo cargado
												$(text).find('#'+id_element+' select option').each(function()
												{
													//Añadir options nuevos si no existe ya, tiene valor, texto y no está en el select actualmente
													if(this.value && this.text && arr2str.search('-'+this.value+this.text) < 0)
													{
														var option = $("<option value="+this.value+"></option>").text(this.text).attr("selected", false);
														//Relation no multiple, individual
														if($('#'+id_element, text).hasClass('multiple_no'))
														{
															$('#'+id_element+' select').append($(option).attr("selected", true));
														}
														else//relation_n multiple
														{
															$('#'+id_element+' select[multiple]').append(option).change();//Añadir como seleccionado
														}
													}
												});
												//Ocultar boxy
												boxy_element.hide();
												//Quitar carga
												loadingEnd();
											}, 'html');
										}
										else //Recarga de la parte modificada
										{
											//Cargar
											loading('.boxy-wrapper', 0.5, 'fixed');
											//Llamada ajax
											$('#'+id_element).load(url_data+'show_full/ #'+id_element+' > *', {}, function()
											{
												loadLb();
												loadIf();
												boxy_element.hide();
												loadingEnd();
											});
										}
									}
									else //Cambiar todo el contenido
									{
										//Cargar
										loading('.boxy-wrapper', 0.5, 'fixed');
										//Obtener url sin parámetros en url ( /param_value)
										var url = String();
										var parts = (url_data).toString().split("/");
										for(i in parts)
										{
											if(parts[i].indexOf('_') == -1 || parts[i].substring(0,3) == 'pag')//No tiene parámetros con _ o es número de página, meter en url
											{
												url = url+parts[i]+'/';
											}
										}

										//Cambia el contenido viejo por el nuevo y activa javascript
										$('#content').load(url+'show_full/ #content > *', {}, function()
										{
											loadLb();
											loadIf();
											boxy_element.hide();
											loadingEnd();
										});
									}
									
									break;
									
								//Error, sigue mostrando ventana y todo el contenido devuelto
								case 'warning':
									boxy_element.setContent(text);
									loadIf();
									break;
								case 'error':
									boxy_element.setContent(text);
									loadIf();
									break;
								default: //Error, mostrar lo que sale
									boxy_element.setContent(text);
									loadIf();
									break;
							}
							return true;
						}
						else
						{
							return false;	
						}
						//Final de cargar
						loadingEnd();

					}, 'xhtml');
				});
			}
		});		
	});

	/**
	 * Boxy para gallery. Al hacer click en un elemento lo añade en el container
	 */
	$("[rel='boxy-gallery']").live('click', function(event)
	{
		loading($(event.target).parent());
		event.preventDefault();		

		//Crear boxy
		Boxy.load($(event.target).attr('href')+'show_full/',
		{
			title: $(event.target).attr('title'),
			closeText: lng.close_boxy,
			actuator: $(event.target),
			afterHide: function()//Tras ocultar, restaurar url de carga de datos
			{
				url_data = window.document.location;
			},
			afterShow: function(r)//Tras mostrar
			{
				loadingEnd();
				//Ventana creada dentro de un boxy, como como ruta de vuelta la referencia
				if($(event.target).closest('boxy-content').length > 0)
				{
					url_data = url_aux;
				}
				else if(url_aux == window.document.location)//Ventana original, url aux para futuras a ella misma
				{
					url_aux = this.options.actuator.attr('href');//Ruta de llamada la nuevo boxy
				}
				
				//--- Session timeout, mostrar formulario de login ---
				if($('#login_footer', r).length > 0)
				{
					alert('La sesión ha terminado. Por favor, vuelva a identificarse');
					window.document.location.href = INSTALATION_DIR+'/admin/';
				}

				//Tamaño más grande de ventana
				this.resize(620, 380);
				this.center();
				
				//Marcar fotos seleccionadas
				var photos_selected = $('.'+$(this.options.actuator).attr('rev')+'_container').find('img');//fotos seleccionadas
				//Fotos mostradas, marcar
				$('img', r).each(function()
				{
					for(var i=0; i < photos_selected.length; i++)
					{
						if($(photos_selected[i]).attr('src') == $(this).attr('src'))
						{
							$(this).parents("a").css('opacity', '0.4');
						}
					}
				});
				
				//Cargar UI
				loadUI();
			},
			behaviours: function(r) //Tras cambiar contenido
			{
				//Tamaño más grande de ventana. Mantener posición del usuario
				this.resize(620, 380);
				this.center();
				
				var boxy_element = this;//Mantener el objeto boxy para llamadas siguientes
				var text_button = '';//Texto del botón, usado para mostrar formulario de subir
				
				//Estilo de galería al contenido
				$(r).addClass('gallery');
				
				//Nombre campo de las fotos
				var field = $(boxy_element.options.actuator).attr('rev');
				//Contenedor de fotos
				var photos_container = $('.'+field+'_container');
				//Marcar fotos seleccionadas
				$('img', photos_container).each(function(i, el)
				{
					$('.gallery img[src="'+$(el).attr('src')+'"]').closest("a").css('opacity', '0.4');
				});
				
				//Deshabilitar lightbox
				$('a[rel="lightbox"], a[rel="boxy"], a[rel="external"]', r).attr('rel', '');

				//Enviar formulario
				$('form', r).unbind('submit').bind('submit', function(event)
				{
					event.preventDefault();
					loading('.boxy-wrapper', 0.5, 'fixed');//Cargando

					//Buscador controlado a mano
					var form = $(event.target);
					$.get(form.attr('action')+'show_full/', form.serialize(), function(text, status)
					{
						//Estado de la llamada ajax
						if(status == 'success')
						{
							//Cargar contenido
							boxy_element.setContent(text);
						}
						loadingEnd();
					}, 'html');
				});
				
				//Click en algún sitio
				$(r).unbind('click keypress').bind('click keypress', function(event)
				{
					//**********
					//Click en foto, copiar en el contenedor
					if($(event.target).parents('#show').length > 0 && $(event.target).closest("a").length > 0)
					{
						var $item_click = $($(event.target).closest("a"));//Enlace cercano al elemento
						
						event.preventDefault();
						loading('.boxy-wrapper', 0.5, 'fixed');//Cargando
						
						//Id de la photo
						var photo_id = $item_click.parents("li[class^='row_']").attr('rel');
											
						//Evitar imagen repetida
						if($('#'+field+'_multimedia_'+photo_id, photos_container).length === 0)
						{
							var block = field.split('_')[1];//Nombre bloque
							var block_real = $('body').attr('id');//Nombre bloque en el que se está
							var icon = '';
							
							//Imagen de youtube, poner icono
							if($('img', $item_click).attr('src').search('ytimg.com') > 1)
							{
								icon = '<img class="youtube" src="'+INSTALATION_DIR+'/img/icons/youtube.png" alt="YouTube"/>';
							}

							var html = $item_click.html();
							//Elemento a insertar
							photos_container.append('<li id="'+field+'_multimedia_'+photo_id+'">'
									+html
									+'<a href="" rel="interface" rev="#'+field+'_multimedia_'+photo_id+'" title="'+lng.del_quest_media+'" class="delete">'+lng.del+'</a><input type="hidden" name="'+block_real+'_'+field+'[]" value="'+photo_id+'"/>'
									+icon
									+'</li>');
							highlight($('#'+field+'_multimedia_'+photo_id));
							$("[rev*="+field+"_multimedia_"+photo_id+"]").interFace();//Evento de borrar
							
							$item_click.css('opacity', 0.4);
						}
						else //Existe imagen en contenedor, quitar
						{
							$('#'+field+'_multimedia_'+photo_id, photos_container).remove();
							$item_click.css('opacity', 1);
						}
						loadingEnd();
					}
					//**********
					//Click en enlace de nuevo elemento
					else if($(event.target).closest('.buttons').length > 0 && $(event.target).parents('.buttons').children().attr('class') == 'action_new')
					{
						event.preventDefault();//Parar comportamiento normal
						$(event).trigger('blur');//Deseleccionar el botón
						loading('.boxy-wrapper', 0.5, 'fixed');//Cargando
						var url_list = $(event.target).attr('href').substring(0, $(event.target).attr('href').length - 1);
						
						//Texto del botón
						if( ! text_button)
						{
							text_button = $(event.target).text();
						}
						
						//Crear formulario de subir si no hay
						if($('.upload_file:visible').length == 0)
						{
							//Ocultar lista de fotos y paginador
							$('.paginator, #show', r).css('display', 'none');
							//Insertar contenedor de formulario
							$(r).append('<div class="upload_file"></div>');
							//Cargar form
							$('.upload_file', r).load($(event.target).attr('href')+'show_full/ #content > *', function(response, data)
							{
								//Texto del botón de añadir, cambiado
								$(event.target).text(lng.photos_list);
								//Cargar cosas de interface
								loadIf();
								
								//Acción del form
								$('.upload_file form', r).attr('action', $('.upload_file form', r).attr('action')+'show_full/');
								//Enviar form
								$('.upload_file form', r).submit(function(event)
								{
									event.preventDefault();
									loading('.boxy-wrapper', 0.5, 'fixed');//Enviar formulario
									
									//Enviar form por ajax
									$.post(INSTALATION_DIR+'/admin/ajax/ajax_actions.php',
									{
										'action': 'new_multimedia',
										'vars': $('.upload_file form', r).serialize()
									}, function(data, response)
									{
										if(data == '"ok"')
										{
											//Página a cargar con la lista. Quitar / final
											var str = url_list;// $(event.target).attr('href').substring(0, $(event.target).attr('href').length - 1);
											var index = str.lastIndexOf('/');//Quitar partes tras último /
											str = str.substring(0, index)+'/show_full/';
		
											$.get(str, function(text, status)
											{
												if(status == 'success')//Estado de la llamada ajax
												{
													boxy_element.setContent(text);
													
												}
												loadingEnd();
											});
										}
										else
										{
											alert('Error al guardar: '+data);
											loadingEnd();
										}
									});
								});
								//Termina de cargar el formulario
								loadingEnd();
							});
						}
						else //Hay subir archivos, mostrar lista fotos
						{
							//Mostrar lista de fotos y paginador
							$('.paginator, #show', r).show();
							$('.upload_file', r).remove();//Quitar formulario
							$(event.target).text(text_button);
							text_button = '';
							
							loadingEnd();
						}
					}
					//**********
					//Demás enlaces (paginador, volver, etc...)
					else if(event.target.nodeName.toLowerCase() == 'a')
					{
						//Tab, comportamiento normal del tab
						if(event.keyCode == 9)
						{
							return;
						}
						else if($(event.target).children().length > 0)//Si tiene hijos, no ejecutar nada
						{
							return false;
						}						
						
						event.preventDefault();
						loading('.boxy-wrapper', 0.5, 'fixed');//Cargando

						//Añadir show_full antes de ?
						var page_load;
						if($(event.target).attr('href').lastIndexOf('?') > 0)
						{
							var index = $(event.target).attr('href').lastIndexOf('?');
							var str = $(event.target).attr('href').substring(0, index-1);
							page_load = str+'/show_full/'+$(event.target).attr('href').substring(index, $(event.target).attr('href').length);
						}
						else
						{
							page_load = $(event.target).attr('href')+'show_full/';
						}
						
						$.get(page_load, function(text, status)
						{
							//Estado de la llamada ajax
							if(status == 'success')
							{
								//Cargar contenido
								boxy_element.setContent(text);
							}
							loadingEnd();
						}, 'html');	
					}
					//**********
					//Otro click, por si acaso dejar cargar
					else
					{
					}
				});
			}
		});
	});

	/**
	 * Boxy para listado. Al hacer click en un elemento lo añade en el container
	 */
	$("[rel='boxy-list']").live('click', function(event)
	{
		loading($(event.target).parent());
		event.preventDefault();

		//Crear boxy
		Boxy.load($(event.target).attr('href')+'show_full/',
		{
			title: $(event.target).attr('title'),
			closeText: lng.close_boxy,
			actuator: $(event.target),
			modal: true,
			afterHide: function()//Tras ocultar, restaurar url de carga de datos

			{
				url_data = window.document.location;
			},
			afterShow: function(r)//Tras mostrar
			{
				//Ventana creada dentro de un boxy, como como ruta de vuelta la referencia
				if($(event.target).closest('boxy-content').length > 0)
				{
					url_data = url_aux;
				}
				else if(url_aux == window.document.location)//Ventana original, url aux para futuras a ella misma
				{
					url_aux = this.options.actuator.attr('href');//Ruta de llamada la nuevo boxy
				}

				//--- Session timeout, mostrar formulario de login ---
				if($('#login_footer', r).length > 0)
				{
					alert('La sesión ha terminado. Por favor, vuelva a identificarse');
					window.document.location.href = INSTALATION_DIR+'/admin/';
				}

				//Tamaño más grande de ventana
				this.resize(650, 400);
				this.center();
				
				//Campo select donde añadir el elemento seleccionado. Elementos seleccionados aqui
				var id_element = $(this.options.actuator).parent().attr('id');
				id_element = id_element.substr(5, id_element.length-5);
				
				//Marcar seleccionados
				$('#'+id_element+'_1 :selected').each(function(el, it)
				{
					$('#show li[rel="'+$(it).val()+'"]').addClass('active');
				})
				
				//Cargar UI
				loadUI();
			},
			behaviours: function(r) //Tras cambiar contenido
			{
				loadingEnd();
				
				//Estilo de galería al contenido				
				$(r).addClass('list');
				$(r).attr('id', 'content_list');
				
				//Tamaño más grande de ventana. Mantener posición del usuario
				this.resize(650, 400);
				this.center();
				
				var boxy_element = this;//Mantener el objeto boxy para llamadas siguientes
				var text_button = '';//Texto del botón, usado para mostrar formulario de subir
				
				//Mensaje click para añadir
				$('[class*="row_"][class!=row_header]', r).attr('title', lng.add_click);
				
				//Campo select donde añadir el elemento seleccionado. Elementos seleccionados aqui
				var id_element = $(boxy_element.options.actuator).parents().attr('id');
				id_element = id_element.substr(5, id_element.length-5);
				
				//Marcar seleccionados
				$('#'+id_element+'_1 :selected').each(function(el, it)
				{
					$('#show li[rel="'+$(it).val()+'"]').addClass('active');
				})

				//Formulario por ajax
				$('form', r).unbind('submit').bind('submit', function(event)
				{
					event.preventDefault();
					loading('.boxy-wrapper', 0.5, 'fixed');//Cargando

					//Buscador controlado a mano
					var form = $(event.target);
					$.ajax(
					{
						'type' : (form.parents('#searcher').length > 0)? 'get' : 'post',
						'url' : form.attr('action')+'show_full/',
						'data' : form.serialize(),
						'success' : function(text, status)
						{
							//Estado de la llamada ajax
							if(status == 'success')
							{
								//Cargar contenido
								boxy_element.setContent(text);
							}
							loadingEnd();
						},
						'dataType' : 'html'
					});
				});

				//Click en algún sitio
				$(r).unbind('click').bind('click', function(event)
				{
					//**********
					//Click en alguna fila del listado
					if($(event.target).parents('#show').length > 0)
					{
						//Desactivar todos los enlaces
						$('#show a').bind('click', function(event){event.preventDefault()});
						event.preventDefault();
						
						//Click en el li
						if($(event.target).is('li') && $(event.target).attr('rel'))
						{
							//Elemento para id de la fila
							var row_id = $(event.target).attr('rel');
							//Elemento a copiar
							var element = $(event.target).children();
							//Fila seleccionada
							$(event.target).addClass('active');
						}
						else if($(event.target).parents('[class*="row_"][class!="row_header"]'))
						{
							//Elemento para id de la fila
							var row_id = $(event.target).parents('li[class^="row_"]').attr('rel');
							//Elemento a copiar
							var element = $(event.target).parents('[class*="row_"]');
							//Fila seleccionada
							$(event.target).parents('[class*="row_"]').addClass('active');
						}
						
						//Datos de la fila visibles

						var texto = sep = '';
						$('div.data', element).each(function(i)
						{
							//Añadir elemento si se ve
							if($(this).attr('display') != 'none' && $(this).css('display') != 'none')
							{
								texto += sep+$(this).text();
								sep = ' ';
							}
						});
						
						//Existe elemento, marcar como seleccionado
						if($("#"+id_element+"_1 option[value='"+row_id+"']").length > 0)
						{
							$("#"+id_element+"_1 option[value='"+row_id+"']").attr("selected",true);
							$('#'+id_element+'_1').change();
						}
						else //No existe, crear
						{
							//Option a añadir
							var $option = $("<option value="+row_id+"></option>").text(texto).attr("selected",true);
							$('#'+id_element+'_1').append($option).change();
						}
					}
					//Demás enlaces (paginador, volver, etc...)
					else if(event.target.nodeName.toLowerCase() == 'a')
					{
						//Tab, comportamiento normal del tab
						if(event.keyCode == 9)
						{
							return;
						}
						else if($(event.target).children().length > 0)//Si tiene hijos, no ejecutar nada
						{
							return false;
						}						
						
						event.preventDefault();
						loading('.boxy-wrapper', 0.5, 'fixed');//Cargando

						//Añadir show_full antes de ?
						var page_load;
						if($(event.target).attr('href').lastIndexOf('?') > 0)
						{
							var index = $(event.target).attr('href').lastIndexOf('?');
							var str = $(event.target).attr('href').substring(0, index-1);
							page_load = str+'/show_full/'+$(event.target).attr('href').substring(index, $(event.target).attr('href').length);
						}
						else
						{
							page_load = $(event.target).attr('href')+'show_full/';
						}
						
						$.get(page_load, function(text, status)
						{
							//Estado de la llamada ajax
							if(status == 'success')
							{
								//Cargar contenido
								boxy_element.setContent(text);
							}
							loadingEnd();
						}, 'html');	
					}
					//**********
					//Otro click, por si acaso dejar de cargar
					else
					{
					}
				});
			}
		});
	});
}


/**
 * Defuscador de email
 * Uso: $(enlace elemento).defuscate();
 */ 
jQuery.fn.defuscate = function()
{
	return this.each(function()
	{
		var email = String($(this).html()).replace(/\s*\(.+\)\s*/, "@");
		$(this).before('<a href="mailto:' + email + '">' + email + "</a>").remove();
	});
}; 


/**
 * Generador de cadenas aleatorias
 * @param length Longitud de la cadena
 * @param special Usar caracteres especiales
 * Uso: $.password(12, [true]);
 */
$.extend({ 
	password: function (length, special)
	{
		var randomNumber = password = "";
		var special = (special == undefined)? false : special;
		
		for(var i = 0; i < length; )
		{
			randomNumber = (Math.floor((Math.random() * 100)) % 94) + 33;
			if( ! special &&
				((randomNumber >=33) && (randomNumber <=47)) ||
				((randomNumber >=58) && (randomNumber <=64)) ||
				((randomNumber >=91) && (randomNumber <=96)) ||
				((randomNumber >=123) && (randomNumber <=126)) )
				{
					continue;
				}
			i++;
			password += String.fromCharCode(randomNumber);
		}
		return password;
	}
});


/**
 * Cargar funcionalidades js tras cargar DOM
 */
$(document).ready(function()
{
	//Carga de lightbox
	loadLb();
	//UI
	loadUI();
	//Carga elementos de interfaz
	loadIf();
	//Carga boxy, cuadros emergentes. Boxy incluye UI
	loadBoxy();
});
