From e40ac65186ab8e5b2c046ef39c80f6248d7e05f0 Mon Sep 17 00:00:00 2001 From: Donald Burr Date: Mon, 12 Oct 2015 19:53:23 -0700 Subject: [PATCH] Add a basic web app (currently only Rank Calc works) --- README.md | 10 +- .../images/ui-bg_flat_30_cccccc_40x100.png | Bin 0 -> 220 bytes .../images/ui-bg_flat_50_5c5c5c_40x100.png | Bin 0 -> 230 bytes .../images/ui-bg_glass_20_555555_1x400.png | Bin 0 -> 260 bytes .../images/ui-bg_glass_40_0078a3_1x400.png | Bin 0 -> 342 bytes .../images/ui-bg_glass_40_ffc73d_1x400.png | Bin 0 -> 316 bytes .../ui-bg_gloss-wave_25_333333_500x100.png | Bin 0 -> 3816 bytes .../ui-bg_highlight-soft_80_eeeeee_1x100.png | Bin 0 -> 276 bytes .../ui-bg_inset-soft_25_000000_1x100.png | Bin 0 -> 275 bytes .../ui-bg_inset-soft_30_f58400_1x100.png | Bin 0 -> 340 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes .../images/ui-icons_4b8e0b_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_a83300_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_cccccc_256x240.png | Bin 0 -> 6975 bytes .../images/ui-icons_ffffff_256x240.png | Bin 0 -> 6299 bytes web_app/css/external/jquery-ui.css | 1225 ++ web_app/css/external/jquery-ui.min.css | 7 + web_app/css/external/jquery-ui.structure.css | 833 + .../css/external/jquery-ui.structure.min.css | 5 + web_app/css/external/jquery-ui.theme.css | 410 + web_app/css/external/jquery-ui.theme.min.css | 5 + web_app/css/sif-tools.css | 23 + web_app/js/external/date.js | 104 + web_app/js/external/jquery-ui.js | 16582 ++++++++++++++++ web_app/js/external/jquery-ui.min.js | 13 + web_app/js/external/jquery.js | 9205 +++++++++ web_app/js/external/jquery.min.js | 4 + web_app/js/external/moment.js | 2936 +++ web_app/js/sif-tools.js | 279 + web_app/sif_tools.html | 118 + 30 files changed, 31758 insertions(+), 1 deletion(-) create mode 100644 web_app/css/external/images/ui-bg_flat_30_cccccc_40x100.png create mode 100644 web_app/css/external/images/ui-bg_flat_50_5c5c5c_40x100.png create mode 100644 web_app/css/external/images/ui-bg_glass_20_555555_1x400.png create mode 100644 web_app/css/external/images/ui-bg_glass_40_0078a3_1x400.png create mode 100644 web_app/css/external/images/ui-bg_glass_40_ffc73d_1x400.png create mode 100644 web_app/css/external/images/ui-bg_gloss-wave_25_333333_500x100.png create mode 100644 web_app/css/external/images/ui-bg_highlight-soft_80_eeeeee_1x100.png create mode 100644 web_app/css/external/images/ui-bg_inset-soft_25_000000_1x100.png create mode 100644 web_app/css/external/images/ui-bg_inset-soft_30_f58400_1x100.png create mode 100644 web_app/css/external/images/ui-icons_222222_256x240.png create mode 100644 web_app/css/external/images/ui-icons_4b8e0b_256x240.png create mode 100644 web_app/css/external/images/ui-icons_a83300_256x240.png create mode 100644 web_app/css/external/images/ui-icons_cccccc_256x240.png create mode 100644 web_app/css/external/images/ui-icons_ffffff_256x240.png create mode 100644 web_app/css/external/jquery-ui.css create mode 100644 web_app/css/external/jquery-ui.min.css create mode 100644 web_app/css/external/jquery-ui.structure.css create mode 100644 web_app/css/external/jquery-ui.structure.min.css create mode 100644 web_app/css/external/jquery-ui.theme.css create mode 100644 web_app/css/external/jquery-ui.theme.min.css create mode 100644 web_app/css/sif-tools.css create mode 100644 web_app/js/external/date.js create mode 100644 web_app/js/external/jquery-ui.js create mode 100644 web_app/js/external/jquery-ui.min.js create mode 100644 web_app/js/external/jquery.js create mode 100644 web_app/js/external/jquery.min.js create mode 100644 web_app/js/external/moment.js create mode 100644 web_app/js/sif-tools.js create mode 100644 web_app/sif_tools.html diff --git a/README.md b/README.md index 52af125..89772f4 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ By Donald Burr ## What is this? -This is a set of Python scripts to help players who play the mobile rhythm game [Love Live School Idol Festival](http://www.school-fes.klabgames.net). +This is a set of Python scripts **(and now a Web app too!)** to help players who play the mobile rhythm game [Love Live School Idol Festival](http://www.school-fes.klabgames.net). Love Live School Idol Festival (SIF) is a free-to-play (with in-app purchases) rhythm and card collection game available for iOS and Android and is based on the [Love Live!](http://www.lovelive-anime.jp/worldwide/) media franchise. @@ -20,6 +20,8 @@ You will need the [Python](https://www.python.org) scripting language installed ## The Scripts +All scripts are located in the [command_line](command_line) directory. + ### Event Time-Remaining Calculator ``` @@ -179,6 +181,12 @@ Today is 10/12/2015 and you currently have 18 love gems. You will have 50 love gems on 01/16/2016. Good things come to those who wait! ``` +## The Web App + +You asked for a web app, and here it is! The [web_app](web_app) directory contains a (mostly) fully featured web app version of SIF Tools. The best part is, you don't need a web server to run it. You should just be able to open the [sif_tools.html](web_app/sif_tools.html) file in your local web browser and run it right on your own computer. You will need to have JavaScript enabled in your browser however. (Of course you can host these files on a web server just like any other website, if you happen to have access to a web server.) + +**Right now the only part of the web app that works is the Rank Calculator. I am working on finishing the rest of the calculators (Love Gem, Card Level-up and Event End.) Stay tuned!** + ## Bugs? Need help? Got any suggestions/ideas for new features? Or want to chat? I wouldn't be surprised if there are any bugs, and/or if I got some of the calculations wrong. If you have any bug reports (or better yet, bug fixes!), suggestions/ideas for new features, or if you need help using these (or if you just want to say hi and/or chat) please feel free to send them my way. Create a pull request on Github or just drop me an email. diff --git a/web_app/css/external/images/ui-bg_flat_30_cccccc_40x100.png b/web_app/css/external/images/ui-bg_flat_30_cccccc_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..4b60b597a31c009eb79876eae49147e40a9748a8 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F0wfqj{vTKlq?nSt-CY>?t&Hpz19_YU9+AaB z+5?Q;PG;Ky8FHR3jv*e$lP#KA4SKlxP~ajahLlrQ(m(7a76DbNmbgZgq$HN4S|t~y z0x1R~149#CLnB=yix5K#D^pV|14~^43o8QyH)Yi`C>nC}Q!>*kaceNIn_B?Xz~JfX K=d#Wzp$Py&k~JFu literal 0 HcmV?d00001 diff --git a/web_app/css/external/images/ui-bg_flat_50_5c5c5c_40x100.png b/web_app/css/external/images/ui-bg_flat_50_5c5c5c_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5d87ac8a62de900601ad6ffb3a4a551faeca904d GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F0VEhM^6M@GQcOwS?k)`f+xyS#2l6-zJR*yM zvcptHiCryl!p*Py>UftDnm{r-UW|Ci*C-NQJ|BmVG&j}3~&vd+(115LU*92t^dF$(Rp5jF*ys9NG0QIe8al4_M) zlnSI6j0_A-bPbJkjVwY8Ev!sUtqd%54J@n-3?78&RiJ3d%}>cptHiBgBImRtKn)C@ Lu6{1-oD!Mnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12U#~x;Tb-9DjS>kdHA?r1fF-|KIlnRtF@qpJAIK#A`jlU}YM!$-9f5NHl z((nGuKvVWVX1%yW@zq|9^kks>R7+eVN>UO_QmvAUQh^kMk%6I!uAz~xkwu81g_WtP rm4T(MfrXWUft#}G859k<`6-!cmAEyS*Uc>eYGCkm^>bP0l+XkK(A;@X literal 0 HcmV?d00001 diff --git a/web_app/css/external/images/ui-bg_glass_40_ffc73d_1x400.png b/web_app/css/external/images/ui-bg_glass_40_ffc73d_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..3c3da55b83d19c4760a7d4b7daeb65b70bacc89c GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12U>ST^vI^j=w#>Q1Fn01na}v_k7%ad<)pq79Cv5pmyWRq^Jxg5j8ee zt4t<8*26rq0-sm=uZddrvMxJ{*+GEC@dJCD)I2uXt;QFYuXaq1k_rh*zMv-FynUxc z$kV-!S08=I{zYiHY}U>*NmenA}d%1A_-4dKD-da`RI%(<*Umn8-Qp Q2v7rqr>mdKI;Vst0CSFKv;Y7A literal 0 HcmV?d00001 diff --git a/web_app/css/external/images/ui-bg_gloss-wave_25_333333_500x100.png b/web_app/css/external/images/ui-bg_gloss-wave_25_333333_500x100.png new file mode 100644 index 0000000000000000000000000000000000000000..dbdb4e4e3aaf0b44cd09a685ae19433e50f1513b GIT binary patch literal 3816 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 QJ~;stWz}Trq%1=J3#jBGg8%>k literal 0 HcmV?d00001 diff --git a/web_app/css/external/images/ui-icons_4b8e0b_256x240.png b/web_app/css/external/images/ui-icons_4b8e0b_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..232832a5aa0a7883c1e0acacfec59e2d1c2088d4 GIT binary patch literal 4549 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 Fe*nBTDe?dS literal 0 HcmV?d00001 diff --git a/web_app/css/external/images/ui-icons_a83300_256x240.png b/web_app/css/external/images/ui-icons_a83300_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..bb22520bbb2a0f465c780e096552d6d8df8e51bd GIT binary patch literal 4549 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 F{txP%Lqq@o literal 0 HcmV?d00001 diff --git a/web_app/css/external/images/ui-icons_ffffff_256x240.png b/web_app/css/external/images/ui-icons_ffffff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..4f624bb2b193750f1a5b36c8c307168c6681a861 GIT binary patch literal 6299 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:(this=start.getTime()&&t<=end.getTime();};Date.prototype.addMilliseconds=function(value){this.setMilliseconds(this.getMilliseconds()+value);return this;};Date.prototype.addSeconds=function(value){return this.addMilliseconds(value*1000);};Date.prototype.addMinutes=function(value){return this.addMilliseconds(value*60000);};Date.prototype.addHours=function(value){return this.addMilliseconds(value*3600000);};Date.prototype.addDays=function(value){return this.addMilliseconds(value*86400000);};Date.prototype.addWeeks=function(value){return this.addMilliseconds(value*604800000);};Date.prototype.addMonths=function(value){var n=this.getDate();this.setDate(1);this.setMonth(this.getMonth()+value);this.setDate(Math.min(n,this.getDaysInMonth()));return this;};Date.prototype.addYears=function(value){return this.addMonths(value*12);};Date.prototype.add=function(config){if(typeof config=="number"){this._orient=config;return this;} +var x=config;if(x.millisecond||x.milliseconds){this.addMilliseconds(x.millisecond||x.milliseconds);} +if(x.second||x.seconds){this.addSeconds(x.second||x.seconds);} +if(x.minute||x.minutes){this.addMinutes(x.minute||x.minutes);} +if(x.hour||x.hours){this.addHours(x.hour||x.hours);} +if(x.month||x.months){this.addMonths(x.month||x.months);} +if(x.year||x.years){this.addYears(x.year||x.years);} +if(x.day||x.days){this.addDays(x.day||x.days);} +return this;};Date._validate=function(value,min,max,name){if(typeof value!="number"){throw new TypeError(value+" is not a Number.");}else if(valuemax){throw new RangeError(value+" is not a valid value for "+name+".");} +return true;};Date.validateMillisecond=function(n){return Date._validate(n,0,999,"milliseconds");};Date.validateSecond=function(n){return Date._validate(n,0,59,"seconds");};Date.validateMinute=function(n){return Date._validate(n,0,59,"minutes");};Date.validateHour=function(n){return Date._validate(n,0,23,"hours");};Date.validateDay=function(n,year,month){return Date._validate(n,1,Date.getDaysInMonth(year,month),"days");};Date.validateMonth=function(n){return Date._validate(n,0,11,"months");};Date.validateYear=function(n){return Date._validate(n,1,9999,"seconds");};Date.prototype.set=function(config){var x=config;if(!x.millisecond&&x.millisecond!==0){x.millisecond=-1;} +if(!x.second&&x.second!==0){x.second=-1;} +if(!x.minute&&x.minute!==0){x.minute=-1;} +if(!x.hour&&x.hour!==0){x.hour=-1;} +if(!x.day&&x.day!==0){x.day=-1;} +if(!x.month&&x.month!==0){x.month=-1;} +if(!x.year&&x.year!==0){x.year=-1;} +if(x.millisecond!=-1&&Date.validateMillisecond(x.millisecond)){this.addMilliseconds(x.millisecond-this.getMilliseconds());} +if(x.second!=-1&&Date.validateSecond(x.second)){this.addSeconds(x.second-this.getSeconds());} +if(x.minute!=-1&&Date.validateMinute(x.minute)){this.addMinutes(x.minute-this.getMinutes());} +if(x.hour!=-1&&Date.validateHour(x.hour)){this.addHours(x.hour-this.getHours());} +if(x.month!==-1&&Date.validateMonth(x.month)){this.addMonths(x.month-this.getMonth());} +if(x.year!=-1&&Date.validateYear(x.year)){this.addYears(x.year-this.getFullYear());} +if(x.day!=-1&&Date.validateDay(x.day,this.getFullYear(),this.getMonth())){this.addDays(x.day-this.getDate());} +if(x.timezone){this.setTimezone(x.timezone);} +if(x.timezoneOffset){this.setTimezoneOffset(x.timezoneOffset);} +return this;};Date.prototype.clearTime=function(){this.setHours(0);this.setMinutes(0);this.setSeconds(0);this.setMilliseconds(0);return this;};Date.prototype.isLeapYear=function(){var y=this.getFullYear();return(((y%4===0)&&(y%100!==0))||(y%400===0));};Date.prototype.isWeekday=function(){return!(this.is().sat()||this.is().sun());};Date.prototype.getDaysInMonth=function(){return Date.getDaysInMonth(this.getFullYear(),this.getMonth());};Date.prototype.moveToFirstDayOfMonth=function(){return this.set({day:1});};Date.prototype.moveToLastDayOfMonth=function(){return this.set({day:this.getDaysInMonth()});};Date.prototype.moveToDayOfWeek=function(day,orient){var diff=(day-this.getDay()+7*(orient||+1))%7;return this.addDays((diff===0)?diff+=7*(orient||+1):diff);};Date.prototype.moveToMonth=function(month,orient){var diff=(month-this.getMonth()+12*(orient||+1))%12;return this.addMonths((diff===0)?diff+=12*(orient||+1):diff);};Date.prototype.getDayOfYear=function(){return Math.floor((this-new Date(this.getFullYear(),0,1))/86400000);};Date.prototype.getWeekOfYear=function(firstDayOfWeek){var y=this.getFullYear(),m=this.getMonth(),d=this.getDate();var dow=firstDayOfWeek||Date.CultureInfo.firstDayOfWeek;var offset=7+1-new Date(y,0,1).getDay();if(offset==8){offset=1;} +var daynum=((Date.UTC(y,m,d,0,0,0)-Date.UTC(y,0,1,0,0,0))/86400000)+1;var w=Math.floor((daynum-offset+7)/7);if(w===dow){y--;var prevOffset=7+1-new Date(y,0,1).getDay();if(prevOffset==2||prevOffset==8){w=53;}else{w=52;}} +return w;};Date.prototype.isDST=function(){console.log('isDST');return this.toString().match(/(E|C|M|P)(S|D)T/)[2]=="D";};Date.prototype.getTimezone=function(){return Date.getTimezoneAbbreviation(this.getUTCOffset,this.isDST());};Date.prototype.setTimezoneOffset=function(s){var here=this.getTimezoneOffset(),there=Number(s)*-6/10;this.addMinutes(there-here);return this;};Date.prototype.setTimezone=function(s){return this.setTimezoneOffset(Date.getTimezoneOffset(s));};Date.prototype.getUTCOffset=function(){var n=this.getTimezoneOffset()*-10/6,r;if(n<0){r=(n-10000).toString();return r[0]+r.substr(2);}else{r=(n+10000).toString();return"+"+r.substr(1);}};Date.prototype.getDayName=function(abbrev){return abbrev?Date.CultureInfo.abbreviatedDayNames[this.getDay()]:Date.CultureInfo.dayNames[this.getDay()];};Date.prototype.getMonthName=function(abbrev){return abbrev?Date.CultureInfo.abbreviatedMonthNames[this.getMonth()]:Date.CultureInfo.monthNames[this.getMonth()];};Date.prototype._toString=Date.prototype.toString;Date.prototype.toString=function(format){var self=this;var p=function p(s){return(s.toString().length==1)?"0"+s:s;};return format?format.replace(/dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?/g,function(format){switch(format){case"hh":return p(self.getHours()<13?self.getHours():(self.getHours()-12));case"h":return self.getHours()<13?self.getHours():(self.getHours()-12);case"HH":return p(self.getHours());case"H":return self.getHours();case"mm":return p(self.getMinutes());case"m":return self.getMinutes();case"ss":return p(self.getSeconds());case"s":return self.getSeconds();case"yyyy":return self.getFullYear();case"yy":return self.getFullYear().toString().substring(2,4);case"dddd":return self.getDayName();case"ddd":return self.getDayName(true);case"dd":return p(self.getDate());case"d":return self.getDate().toString();case"MMMM":return self.getMonthName();case"MMM":return self.getMonthName(true);case"MM":return p((self.getMonth()+1));case"M":return self.getMonth()+1;case"t":return self.getHours()<12?Date.CultureInfo.amDesignator.substring(0,1):Date.CultureInfo.pmDesignator.substring(0,1);case"tt":return self.getHours()<12?Date.CultureInfo.amDesignator:Date.CultureInfo.pmDesignator;case"zzz":case"zz":case"z":return"";}}):this._toString();}; +Date.now=function(){return new Date();};Date.today=function(){return Date.now().clearTime();};Date.prototype._orient=+1;Date.prototype.next=function(){this._orient=+1;return this;};Date.prototype.last=Date.prototype.prev=Date.prototype.previous=function(){this._orient=-1;return this;};Date.prototype._is=false;Date.prototype.is=function(){this._is=true;return this;};Number.prototype._dateElement="day";Number.prototype.fromNow=function(){var c={};c[this._dateElement]=this;return Date.now().add(c);};Number.prototype.ago=function(){var c={};c[this._dateElement]=this*-1;return Date.now().add(c);};(function(){var $D=Date.prototype,$N=Number.prototype;var dx=("sunday monday tuesday wednesday thursday friday saturday").split(/\s/),mx=("january february march april may june july august september october november december").split(/\s/),px=("Millisecond Second Minute Hour Day Week Month Year").split(/\s/),de;var df=function(n){return function(){if(this._is){this._is=false;return this.getDay()==n;} +return this.moveToDayOfWeek(n,this._orient);};};for(var i=0;i0&&!last){try{q=d.call(this,r[1]);}catch(ex){last=true;}}else{last=true;} +if(!last&&q[1].length===0){last=true;} +if(!last){var qx=[];for(var j=0;j0){rx[0]=rx[0].concat(p[0]);rx[1]=p[1];}} +if(rx[1].length1){args=Array.prototype.slice.call(arguments);}else if(arguments[0]instanceof Array){args=arguments[0];} +if(args){for(var i=0,px=args.shift();i2)?n:(n+(((n+2000)Date.getDaysInMonth(this.year,this.month)){throw new RangeError(this.day+" is not a valid value for days.");} +var r=new Date(this.year,this.month,this.day,this.hour,this.minute,this.second);if(this.timezone){r.set({timezone:this.timezone});}else if(this.timezoneOffset){r.set({timezoneOffset:this.timezoneOffset});} +return r;},finish:function(x){x=(x instanceof Array)?flattenAndCompact(x):[x];if(x.length===0){return null;} +for(var i=0;i= 0 ) && focusable( element, !isTabIndexNaN ); + } +}); + +// support: jQuery <1.8 +if ( !$( "" ).outerWidth( 1 ).jquery ) { + $.each( [ "Width", "Height" ], function( i, name ) { + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], + type = name.toLowerCase(), + orig = { + innerWidth: $.fn.innerWidth, + innerHeight: $.fn.innerHeight, + outerWidth: $.fn.outerWidth, + outerHeight: $.fn.outerHeight + }; + + function reduce( elem, size, border, margin ) { + $.each( side, function() { + size -= parseFloat( $.css( elem, "padding" + this ) ) || 0; + if ( border ) { + size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0; + } + if ( margin ) { + size -= parseFloat( $.css( elem, "margin" + this ) ) || 0; + } + }); + return size; + } + + $.fn[ "inner" + name ] = function( size ) { + if ( size === undefined ) { + return orig[ "inner" + name ].call( this ); + } + + return this.each(function() { + $( this ).css( type, reduce( this, size ) + "px" ); + }); + }; + + $.fn[ "outer" + name] = function( size, margin ) { + if ( typeof size !== "number" ) { + return orig[ "outer" + name ].call( this, size ); + } + + return this.each(function() { + $( this).css( type, reduce( this, size, true, margin ) + "px" ); + }); + }; + }); +} + +// support: jQuery <1.8 +if ( !$.fn.addBack ) { + $.fn.addBack = function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + }; +} + +// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413) +if ( $( "" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) { + $.fn.removeData = (function( removeData ) { + return function( key ) { + if ( arguments.length ) { + return removeData.call( this, $.camelCase( key ) ); + } else { + return removeData.call( this ); + } + }; + })( $.fn.removeData ); +} + +// deprecated +$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); + +$.fn.extend({ + focus: (function( orig ) { + return function( delay, fn ) { + return typeof delay === "number" ? + this.each(function() { + var elem = this; + setTimeout(function() { + $( elem ).focus(); + if ( fn ) { + fn.call( elem ); + } + }, delay ); + }) : + orig.apply( this, arguments ); + }; + })( $.fn.focus ), + + disableSelection: (function() { + var eventType = "onselectstart" in document.createElement( "div" ) ? + "selectstart" : + "mousedown"; + + return function() { + return this.bind( eventType + ".ui-disableSelection", function( event ) { + event.preventDefault(); + }); + }; + })(), + + enableSelection: function() { + return this.unbind( ".ui-disableSelection" ); + }, + + zIndex: function( zIndex ) { + if ( zIndex !== undefined ) { + return this.css( "zIndex", zIndex ); + } + + if ( this.length ) { + var elem = $( this[ 0 ] ), position, value; + while ( elem.length && elem[ 0 ] !== document ) { + // Ignore z-index if position is set to a value where z-index is ignored by the browser + // This makes behavior of this function consistent across browsers + // WebKit always returns auto if the element is positioned + position = elem.css( "position" ); + if ( position === "absolute" || position === "relative" || position === "fixed" ) { + // IE returns 0 when zIndex is not specified + // other browsers return a string + // we ignore the case of nested elements with an explicit value of 0 + //
+ value = parseInt( elem.css( "zIndex" ), 10 ); + if ( !isNaN( value ) && value !== 0 ) { + return value; + } + } + elem = elem.parent(); + } + } + + return 0; + } +}); + +// $.ui.plugin is deprecated. Use $.widget() extensions instead. +$.ui.plugin = { + add: function( module, option, set ) { + var i, + proto = $.ui[ module ].prototype; + for ( i in set ) { + proto.plugins[ i ] = proto.plugins[ i ] || []; + proto.plugins[ i ].push( [ option, set[ i ] ] ); + } + }, + call: function( instance, name, args, allowDisconnected ) { + var i, + set = instance.plugins[ name ]; + + if ( !set ) { + return; + } + + if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) { + return; + } + + for ( i = 0; i < set.length; i++ ) { + if ( instance.options[ set[ i ][ 0 ] ] ) { + set[ i ][ 1 ].apply( instance.element, args ); + } + } + } +}; + + +/*! + * jQuery UI Widget 1.11.2 + * http://jqueryui.com + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/jQuery.widget/ + */ + + +var widget_uuid = 0, + widget_slice = Array.prototype.slice; + +$.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { + try { + + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} + } + orig( elems ); + }; +})( $.cleanData ); + +$.widget = function( name, base, prototype ) { + var fullName, existingConstructor, constructor, basePrototype, + // proxiedPrototype allows the provided prototype to remain unmodified + // so that it can be used as a mixin for multiple widgets (#8876) + proxiedPrototype = {}, + namespace = name.split( "." )[ 0 ]; + + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { + return !!$.data( elem, fullName ); + }; + + $[ namespace ] = $[ namespace ] || {}; + existingConstructor = $[ namespace ][ name ]; + constructor = $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without "new" keyword + if ( !this._createWidget ) { + return new constructor( options, element ); + } + + // allow instantiation without initializing for simple inheritance + // must use "new" keyword (the code above always passes args) + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + // extend with the existing constructor to carry over any static properties + $.extend( constructor, existingConstructor, { + version: prototype.version, + // copy the object used to create the prototype in case we need to + // redefine the widget later + _proto: $.extend( {}, prototype ), + // track widgets that inherit from this widget in case this widget is + // redefined after a widget inherits from it + _childConstructors: [] + }); + + basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from + basePrototype.options = $.widget.extend( {}, basePrototype.options ); + $.each( prototype, function( prop, value ) { + if ( !$.isFunction( value ) ) { + proxiedPrototype[ prop ] = value; + return; + } + proxiedPrototype[ prop ] = (function() { + var _super = function() { + return base.prototype[ prop ].apply( this, arguments ); + }, + _superApply = function( args ) { + return base.prototype[ prop ].apply( this, args ); + }; + return function() { + var __super = this._super, + __superApply = this._superApply, + returnValue; + + this._super = _super; + this._superApply = _superApply; + + returnValue = value.apply( this, arguments ); + + this._super = __super; + this._superApply = __superApply; + + return returnValue; + }; + })(); + }); + constructor.prototype = $.widget.extend( basePrototype, { + // TODO: remove support for widgetEventPrefix + // always use the name + a colon as the prefix, e.g., draggable:start + // don't prefix for widgets that aren't DOM-based + widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name + }, proxiedPrototype, { + constructor: constructor, + namespace: namespace, + widgetName: name, + widgetFullName: fullName + }); + + // If this widget is being redefined then we need to find all widgets that + // are inheriting from it and redefine all of them so that they inherit from + // the new version of this widget. We're essentially trying to replace one + // level in the prototype chain. + if ( existingConstructor ) { + $.each( existingConstructor._childConstructors, function( i, child ) { + var childPrototype = child.prototype; + + // redefine the child widget using the same prototype that was + // originally used, but inherit from the new version of the base + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); + }); + // remove the list of existing child constructors from the old constructor + // so the old child constructors can be garbage collected + delete existingConstructor._childConstructors; + } else { + base._childConstructors.push( constructor ); + } + + $.widget.bridge( name, constructor ); + + return constructor; +}; + +$.widget.extend = function( target ) { + var input = widget_slice.call( arguments, 1 ), + inputIndex = 0, + inputLength = input.length, + key, + value; + for ( ; inputIndex < inputLength; inputIndex++ ) { + for ( key in input[ inputIndex ] ) { + value = input[ inputIndex ][ key ]; + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { + // Clone objects + if ( $.isPlainObject( value ) ) { + target[ key ] = $.isPlainObject( target[ key ] ) ? + $.widget.extend( {}, target[ key ], value ) : + // Don't extend strings, arrays, etc. with objects + $.widget.extend( {}, value ); + // Copy everything else by reference + } else { + target[ key ] = value; + } + } + } + } + return target; +}; + +$.widget.bridge = function( name, object ) { + var fullName = object.prototype.widgetFullName || name; + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = widget_slice.call( arguments, 1 ), + returnValue = this; + + // allow multiple hashes to be passed on init + options = !isMethodCall && args.length ? + $.widget.extend.apply( null, [ options ].concat(args) ) : + options; + + if ( isMethodCall ) { + this.each(function() { + var methodValue, + instance = $.data( this, fullName ); + if ( options === "instance" ) { + returnValue = instance; + return false; + } + if ( !instance ) { + return $.error( "cannot call methods on " + name + " prior to initialization; " + + "attempted to call method '" + options + "'" ); + } + if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { + return $.error( "no such method '" + options + "' for " + name + " widget instance" ); + } + methodValue = instance[ options ].apply( instance, args ); + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue && methodValue.jquery ? + returnValue.pushStack( methodValue.get() ) : + methodValue; + return false; + } + }); + } else { + this.each(function() { + var instance = $.data( this, fullName ); + if ( instance ) { + instance.option( options || {} ); + if ( instance._init ) { + instance._init(); + } + } else { + $.data( this, fullName, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( /* options, element */ ) {}; +$.Widget._childConstructors = []; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + defaultElement: "
", + options: { + disabled: false, + + // callbacks + create: null + }, + _createWidget: function( options, element ) { + element = $( element || this.defaultElement || this )[ 0 ]; + this.element = $( element ); + this.uuid = widget_uuid++; + this.eventNamespace = "." + this.widgetName + this.uuid; + + this.bindings = $(); + this.hoverable = $(); + this.focusable = $(); + + if ( element !== this ) { + $.data( element, this.widgetFullName, this ); + this._on( true, this.element, { + remove: function( event ) { + if ( event.target === element ) { + this.destroy(); + } + } + }); + this.document = $( element.style ? + // element within the document + element.ownerDocument : + // element is window or document + element.document || element ); + this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); + } + + this.options = $.widget.extend( {}, + this.options, + this._getCreateOptions(), + options ); + + this._create(); + this._trigger( "create", null, this._getCreateEventData() ); + this._init(); + }, + _getCreateOptions: $.noop, + _getCreateEventData: $.noop, + _create: $.noop, + _init: $.noop, + + destroy: function() { + this._destroy(); + // we can probably remove the unbind calls in 2.0 + // all event bindings should go through this._on() + this.element + .unbind( this.eventNamespace ) + .removeData( this.widgetFullName ) + // support: jquery <1.6.3 + // http://bugs.jquery.com/ticket/9413 + .removeData( $.camelCase( this.widgetFullName ) ); + this.widget() + .unbind( this.eventNamespace ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetFullName + "-disabled " + + "ui-state-disabled" ); + + // clean up events and states + this.bindings.unbind( this.eventNamespace ); + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + }, + _destroy: $.noop, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key, + parts, + curOption, + i; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.widget.extend( {}, this.options ); + } + + if ( typeof key === "string" ) { + // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } + options = {}; + parts = key.split( "." ); + key = parts.shift(); + if ( parts.length ) { + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); + for ( i = 0; i < parts.length - 1; i++ ) { + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; + curOption = curOption[ parts[ i ] ]; + } + key = parts.pop(); + if ( arguments.length === 1 ) { + return curOption[ key ] === undefined ? null : curOption[ key ]; + } + curOption[ key ] = value; + } else { + if ( arguments.length === 1 ) { + return this.options[ key ] === undefined ? null : this.options[ key ]; + } + options[ key ] = value; + } + } + + this._setOptions( options ); + + return this; + }, + _setOptions: function( options ) { + var key; + + for ( key in options ) { + this._setOption( key, options[ key ] ); + } + + return this; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + .toggleClass( this.widgetFullName + "-disabled", !!value ); + + // If the widget is becoming disabled, then nothing is interactive + if ( value ) { + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + } + } + + return this; + }, + + enable: function() { + return this._setOptions({ disabled: false }); + }, + disable: function() { + return this._setOptions({ disabled: true }); + }, + + _on: function( suppressDisabledCheck, element, handlers ) { + var delegateElement, + instance = this; + + // no suppressDisabledCheck flag, shuffle arguments + if ( typeof suppressDisabledCheck !== "boolean" ) { + handlers = element; + element = suppressDisabledCheck; + suppressDisabledCheck = false; + } + + // no element argument, shuffle and use this.element + if ( !handlers ) { + handlers = element; + element = this.element; + delegateElement = this.widget(); + } else { + element = delegateElement = $( element ); + this.bindings = this.bindings.add( element ); + } + + $.each( handlers, function( event, handler ) { + function handlerProxy() { + // allow widgets to customize the disabled handling + // - disabled as an array instead of boolean + // - disabled class as method for disabling individual parts + if ( !suppressDisabledCheck && + ( instance.options.disabled === true || + $( this ).hasClass( "ui-state-disabled" ) ) ) { + return; + } + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + + // copy the guid so direct unbinding works + if ( typeof handler !== "string" ) { + handlerProxy.guid = handler.guid = + handler.guid || handlerProxy.guid || $.guid++; + } + + var match = event.match( /^([\w:-]*)\s*(.*)$/ ), + eventName = match[1] + instance.eventNamespace, + selector = match[2]; + if ( selector ) { + delegateElement.delegate( selector, eventName, handlerProxy ); + } else { + element.bind( eventName, handlerProxy ); + } + }); + }, + + _off: function( element, eventName ) { + eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + + this.eventNamespace; + element.unbind( eventName ).undelegate( eventName ); + + // Clear the stack to avoid memory leaks (#10056) + this.bindings = $( this.bindings.not( element ).get() ); + this.focusable = $( this.focusable.not( element ).get() ); + this.hoverable = $( this.hoverable.not( element ).get() ); + }, + + _delay: function( handler, delay ) { + function handlerProxy() { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + var instance = this; + return setTimeout( handlerProxy, delay || 0 ); + }, + + _hoverable: function( element ) { + this.hoverable = this.hoverable.add( element ); + this._on( element, { + mouseenter: function( event ) { + $( event.currentTarget ).addClass( "ui-state-hover" ); + }, + mouseleave: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-hover" ); + } + }); + }, + + _focusable: function( element ) { + this.focusable = this.focusable.add( element ); + this._on( element, { + focusin: function( event ) { + $( event.currentTarget ).addClass( "ui-state-focus" ); + }, + focusout: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-focus" ); + } + }); + }, + + _trigger: function( type, event, data ) { + var prop, orig, + callback = this.options[ type ]; + + data = data || {}; + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + // the original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; + + // copy original event properties over to the new event + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } + } + } + + this.element.trigger( event, data ); + return !( $.isFunction( callback ) && + callback.apply( this.element[0], [ event ].concat( data ) ) === false || + event.isDefaultPrevented() ); + } +}; + +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { + if ( typeof options === "string" ) { + options = { effect: options }; + } + var hasOptions, + effectName = !options ? + method : + options === true || typeof options === "number" ? + defaultEffect : + options.effect || defaultEffect; + options = options || {}; + if ( typeof options === "number" ) { + options = { duration: options }; + } + hasOptions = !$.isEmptyObject( options ); + options.complete = callback; + if ( options.delay ) { + element.delay( options.delay ); + } + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { + element[ method ]( options ); + } else if ( effectName !== method && element[ effectName ] ) { + element[ effectName ]( options.duration, options.easing, callback ); + } else { + element.queue(function( next ) { + $( this )[ method ](); + if ( callback ) { + callback.call( element[ 0 ] ); + } + next(); + }); + } + }; +}); + +var widget = $.widget; + + +/*! + * jQuery UI Mouse 1.11.2 + * http://jqueryui.com + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/mouse/ + */ + + +var mouseHandled = false; +$( document ).mouseup( function() { + mouseHandled = false; +}); + +var mouse = $.widget("ui.mouse", { + version: "1.11.2", + options: { + cancel: "input,textarea,button,select,option", + distance: 1, + delay: 0 + }, + _mouseInit: function() { + var that = this; + + this.element + .bind("mousedown." + this.widgetName, function(event) { + return that._mouseDown(event); + }) + .bind("click." + this.widgetName, function(event) { + if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) { + $.removeData(event.target, that.widgetName + ".preventClickEvent"); + event.stopImmediatePropagation(); + return false; + } + }); + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + _mouseDestroy: function() { + this.element.unbind("." + this.widgetName); + if ( this._mouseMoveDelegate ) { + this.document + .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate) + .unbind("mouseup." + this.widgetName, this._mouseUpDelegate); + } + }, + + _mouseDown: function(event) { + // don't let more than one widget handle mouseStart + if ( mouseHandled ) { + return; + } + + this._mouseMoved = false; + + // we may have missed mouseup (out of window) + (this._mouseStarted && this._mouseUp(event)); + + this._mouseDownEvent = event; + + var that = this, + btnIsLeft = (event.which === 1), + // event.target.nodeName works around a bug in IE 8 with + // disabled inputs (#7620) + elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false); + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { + return true; + } + + this.mouseDelayMet = !this.options.delay; + if (!this.mouseDelayMet) { + this._mouseDelayTimer = setTimeout(function() { + that.mouseDelayMet = true; + }, this.options.delay); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = (this._mouseStart(event) !== false); + if (!this._mouseStarted) { + event.preventDefault(); + return true; + } + } + + // Click event may never have fired (Gecko & Opera) + if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) { + $.removeData(event.target, this.widgetName + ".preventClickEvent"); + } + + // these delegates are required to keep context + this._mouseMoveDelegate = function(event) { + return that._mouseMove(event); + }; + this._mouseUpDelegate = function(event) { + return that._mouseUp(event); + }; + + this.document + .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) + .bind( "mouseup." + this.widgetName, this._mouseUpDelegate ); + + event.preventDefault(); + + mouseHandled = true; + return true; + }, + + _mouseMove: function(event) { + // Only check for mouseups outside the document if you've moved inside the document + // at least once. This prevents the firing of mouseup in the case of IE<9, which will + // fire a mousemove event if content is placed under the cursor. See #7778 + // Support: IE <9 + if ( this._mouseMoved ) { + // IE mouseup check - mouseup happened when mouse was out of window + if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) { + return this._mouseUp(event); + + // Iframe mouseup check - mouseup occurred in another document + } else if ( !event.which ) { + return this._mouseUp( event ); + } + } + + if ( event.which || event.button ) { + this._mouseMoved = true; + } + + if (this._mouseStarted) { + this._mouseDrag(event); + return event.preventDefault(); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = + (this._mouseStart(this._mouseDownEvent, event) !== false); + (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); + } + + return !this._mouseStarted; + }, + + _mouseUp: function(event) { + this.document + .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) + .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate ); + + if (this._mouseStarted) { + this._mouseStarted = false; + + if (event.target === this._mouseDownEvent.target) { + $.data(event.target, this.widgetName + ".preventClickEvent", true); + } + + this._mouseStop(event); + } + + mouseHandled = false; + return false; + }, + + _mouseDistanceMet: function(event) { + return (Math.max( + Math.abs(this._mouseDownEvent.pageX - event.pageX), + Math.abs(this._mouseDownEvent.pageY - event.pageY) + ) >= this.options.distance + ); + }, + + _mouseDelayMet: function(/* event */) { + return this.mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + _mouseStart: function(/* event */) {}, + _mouseDrag: function(/* event */) {}, + _mouseStop: function(/* event */) {}, + _mouseCapture: function(/* event */) { return true; } +}); + + +/*! + * jQuery UI Position 1.11.2 + * http://jqueryui.com + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/position/ + */ + +(function() { + +$.ui = $.ui || {}; + +var cachedScrollbarWidth, supportsOffsetFractions, + max = Math.max, + abs = Math.abs, + round = Math.round, + rhorizontal = /left|center|right/, + rvertical = /top|center|bottom/, + roffset = /[\+\-]\d+(\.[\d]+)?%?/, + rposition = /^\w+/, + rpercent = /%$/, + _position = $.fn.position; + +function getOffsets( offsets, width, height ) { + return [ + parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), + parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) + ]; +} + +function parseCss( element, property ) { + return parseInt( $.css( element, property ), 10 ) || 0; +} + +function getDimensions( elem ) { + var raw = elem[0]; + if ( raw.nodeType === 9 ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: 0, left: 0 } + }; + } + if ( $.isWindow( raw ) ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: elem.scrollTop(), left: elem.scrollLeft() } + }; + } + if ( raw.preventDefault ) { + return { + width: 0, + height: 0, + offset: { top: raw.pageY, left: raw.pageX } + }; + } + return { + width: elem.outerWidth(), + height: elem.outerHeight(), + offset: elem.offset() + }; +} + +$.position = { + scrollbarWidth: function() { + if ( cachedScrollbarWidth !== undefined ) { + return cachedScrollbarWidth; + } + var w1, w2, + div = $( "
" ), + innerDiv = div.children()[0]; + + $( "body" ).append( div ); + w1 = innerDiv.offsetWidth; + div.css( "overflow", "scroll" ); + + w2 = innerDiv.offsetWidth; + + if ( w1 === w2 ) { + w2 = div[0].clientWidth; + } + + div.remove(); + + return (cachedScrollbarWidth = w1 - w2); + }, + getScrollInfo: function( within ) { + var overflowX = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-x" ), + overflowY = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-y" ), + hasOverflowX = overflowX === "scroll" || + ( overflowX === "auto" && within.width < within.element[0].scrollWidth ), + hasOverflowY = overflowY === "scroll" || + ( overflowY === "auto" && within.height < within.element[0].scrollHeight ); + return { + width: hasOverflowY ? $.position.scrollbarWidth() : 0, + height: hasOverflowX ? $.position.scrollbarWidth() : 0 + }; + }, + getWithinInfo: function( element ) { + var withinElement = $( element || window ), + isWindow = $.isWindow( withinElement[0] ), + isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9; + return { + element: withinElement, + isWindow: isWindow, + isDocument: isDocument, + offset: withinElement.offset() || { left: 0, top: 0 }, + scrollLeft: withinElement.scrollLeft(), + scrollTop: withinElement.scrollTop(), + + // support: jQuery 1.6.x + // jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows + width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(), + height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight() + }; + } +}; + +$.fn.position = function( options ) { + if ( !options || !options.of ) { + return _position.apply( this, arguments ); + } + + // make a copy, we don't want to modify arguments + options = $.extend( {}, options ); + + var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, + target = $( options.of ), + within = $.position.getWithinInfo( options.within ), + scrollInfo = $.position.getScrollInfo( within ), + collision = ( options.collision || "flip" ).split( " " ), + offsets = {}; + + dimensions = getDimensions( target ); + if ( target[0].preventDefault ) { + // force left top to allow flipping + options.at = "left top"; + } + targetWidth = dimensions.width; + targetHeight = dimensions.height; + targetOffset = dimensions.offset; + // clone to reuse original targetOffset later + basePosition = $.extend( {}, targetOffset ); + + // force my and at to have valid horizontal and vertical positions + // if a value is missing or invalid, it will be converted to center + $.each( [ "my", "at" ], function() { + var pos = ( options[ this ] || "" ).split( " " ), + horizontalOffset, + verticalOffset; + + if ( pos.length === 1) { + pos = rhorizontal.test( pos[ 0 ] ) ? + pos.concat( [ "center" ] ) : + rvertical.test( pos[ 0 ] ) ? + [ "center" ].concat( pos ) : + [ "center", "center" ]; + } + pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; + pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; + + // calculate offsets + horizontalOffset = roffset.exec( pos[ 0 ] ); + verticalOffset = roffset.exec( pos[ 1 ] ); + offsets[ this ] = [ + horizontalOffset ? horizontalOffset[ 0 ] : 0, + verticalOffset ? verticalOffset[ 0 ] : 0 + ]; + + // reduce to just the positions without the offsets + options[ this ] = [ + rposition.exec( pos[ 0 ] )[ 0 ], + rposition.exec( pos[ 1 ] )[ 0 ] + ]; + }); + + // normalize collision option + if ( collision.length === 1 ) { + collision[ 1 ] = collision[ 0 ]; + } + + if ( options.at[ 0 ] === "right" ) { + basePosition.left += targetWidth; + } else if ( options.at[ 0 ] === "center" ) { + basePosition.left += targetWidth / 2; + } + + if ( options.at[ 1 ] === "bottom" ) { + basePosition.top += targetHeight; + } else if ( options.at[ 1 ] === "center" ) { + basePosition.top += targetHeight / 2; + } + + atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); + basePosition.left += atOffset[ 0 ]; + basePosition.top += atOffset[ 1 ]; + + return this.each(function() { + var collisionPosition, using, + elem = $( this ), + elemWidth = elem.outerWidth(), + elemHeight = elem.outerHeight(), + marginLeft = parseCss( this, "marginLeft" ), + marginTop = parseCss( this, "marginTop" ), + collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width, + collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height, + position = $.extend( {}, basePosition ), + myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); + + if ( options.my[ 0 ] === "right" ) { + position.left -= elemWidth; + } else if ( options.my[ 0 ] === "center" ) { + position.left -= elemWidth / 2; + } + + if ( options.my[ 1 ] === "bottom" ) { + position.top -= elemHeight; + } else if ( options.my[ 1 ] === "center" ) { + position.top -= elemHeight / 2; + } + + position.left += myOffset[ 0 ]; + position.top += myOffset[ 1 ]; + + // if the browser doesn't support fractions, then round for consistent results + if ( !supportsOffsetFractions ) { + position.left = round( position.left ); + position.top = round( position.top ); + } + + collisionPosition = { + marginLeft: marginLeft, + marginTop: marginTop + }; + + $.each( [ "left", "top" ], function( i, dir ) { + if ( $.ui.position[ collision[ i ] ] ) { + $.ui.position[ collision[ i ] ][ dir ]( position, { + targetWidth: targetWidth, + targetHeight: targetHeight, + elemWidth: elemWidth, + elemHeight: elemHeight, + collisionPosition: collisionPosition, + collisionWidth: collisionWidth, + collisionHeight: collisionHeight, + offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], + my: options.my, + at: options.at, + within: within, + elem: elem + }); + } + }); + + if ( options.using ) { + // adds feedback as second argument to using callback, if present + using = function( props ) { + var left = targetOffset.left - position.left, + right = left + targetWidth - elemWidth, + top = targetOffset.top - position.top, + bottom = top + targetHeight - elemHeight, + feedback = { + target: { + element: target, + left: targetOffset.left, + top: targetOffset.top, + width: targetWidth, + height: targetHeight + }, + element: { + element: elem, + left: position.left, + top: position.top, + width: elemWidth, + height: elemHeight + }, + horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", + vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" + }; + if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { + feedback.horizontal = "center"; + } + if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { + feedback.vertical = "middle"; + } + if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { + feedback.important = "horizontal"; + } else { + feedback.important = "vertical"; + } + options.using.call( this, props, feedback ); + }; + } + + elem.offset( $.extend( position, { using: using } ) ); + }); +}; + +$.ui.position = { + fit: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, + outerWidth = within.width, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = withinOffset - collisionPosLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, + newOverRight; + + // element is wider than within + if ( data.collisionWidth > outerWidth ) { + // element is initially over the left side of within + if ( overLeft > 0 && overRight <= 0 ) { + newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset; + position.left += overLeft - newOverRight; + // element is initially over right side of within + } else if ( overRight > 0 && overLeft <= 0 ) { + position.left = withinOffset; + // element is initially over both left and right sides of within + } else { + if ( overLeft > overRight ) { + position.left = withinOffset + outerWidth - data.collisionWidth; + } else { + position.left = withinOffset; + } + } + // too far left -> align with left edge + } else if ( overLeft > 0 ) { + position.left += overLeft; + // too far right -> align with right edge + } else if ( overRight > 0 ) { + position.left -= overRight; + // adjust based on position and margin + } else { + position.left = max( position.left - collisionPosLeft, position.left ); + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollTop : within.offset.top, + outerHeight = data.within.height, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = withinOffset - collisionPosTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, + newOverBottom; + + // element is taller than within + if ( data.collisionHeight > outerHeight ) { + // element is initially over the top of within + if ( overTop > 0 && overBottom <= 0 ) { + newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset; + position.top += overTop - newOverBottom; + // element is initially over bottom of within + } else if ( overBottom > 0 && overTop <= 0 ) { + position.top = withinOffset; + // element is initially over both top and bottom of within + } else { + if ( overTop > overBottom ) { + position.top = withinOffset + outerHeight - data.collisionHeight; + } else { + position.top = withinOffset; + } + } + // too far up -> align with top + } else if ( overTop > 0 ) { + position.top += overTop; + // too far down -> align with bottom edge + } else if ( overBottom > 0 ) { + position.top -= overBottom; + // adjust based on position and margin + } else { + position.top = max( position.top - collisionPosTop, position.top ); + } + } + }, + flip: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.offset.left + within.scrollLeft, + outerWidth = within.width, + offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = collisionPosLeft - offsetLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, + myOffset = data.my[ 0 ] === "left" ? + -data.elemWidth : + data.my[ 0 ] === "right" ? + data.elemWidth : + 0, + atOffset = data.at[ 0 ] === "left" ? + data.targetWidth : + data.at[ 0 ] === "right" ? + -data.targetWidth : + 0, + offset = -2 * data.offset[ 0 ], + newOverRight, + newOverLeft; + + if ( overLeft < 0 ) { + newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset; + if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { + position.left += myOffset + atOffset + offset; + } + } else if ( overRight > 0 ) { + newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; + if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { + position.left += myOffset + atOffset + offset; + } + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.offset.top + within.scrollTop, + outerHeight = within.height, + offsetTop = within.isWindow ? within.scrollTop : within.offset.top, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = collisionPosTop - offsetTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, + top = data.my[ 1 ] === "top", + myOffset = top ? + -data.elemHeight : + data.my[ 1 ] === "bottom" ? + data.elemHeight : + 0, + atOffset = data.at[ 1 ] === "top" ? + data.targetHeight : + data.at[ 1 ] === "bottom" ? + -data.targetHeight : + 0, + offset = -2 * data.offset[ 1 ], + newOverTop, + newOverBottom; + if ( overTop < 0 ) { + newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset; + if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) { + position.top += myOffset + atOffset + offset; + } + } else if ( overBottom > 0 ) { + newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; + if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) { + position.top += myOffset + atOffset + offset; + } + } + } + }, + flipfit: { + left: function() { + $.ui.position.flip.left.apply( this, arguments ); + $.ui.position.fit.left.apply( this, arguments ); + }, + top: function() { + $.ui.position.flip.top.apply( this, arguments ); + $.ui.position.fit.top.apply( this, arguments ); + } + } +}; + +// fraction support test +(function() { + var testElement, testElementParent, testElementStyle, offsetLeft, i, + body = document.getElementsByTagName( "body" )[ 0 ], + div = document.createElement( "div" ); + + //Create a "fake body" for testing based on method used in jQuery.support + testElement = document.createElement( body ? "div" : "body" ); + testElementStyle = { + visibility: "hidden", + width: 0, + height: 0, + border: 0, + margin: 0, + background: "none" + }; + if ( body ) { + $.extend( testElementStyle, { + position: "absolute", + left: "-1000px", + top: "-1000px" + }); + } + for ( i in testElementStyle ) { + testElement.style[ i ] = testElementStyle[ i ]; + } + testElement.appendChild( div ); + testElementParent = body || document.documentElement; + testElementParent.insertBefore( testElement, testElementParent.firstChild ); + + div.style.cssText = "position: absolute; left: 10.7432222px;"; + + offsetLeft = $( div ).offset().left; + supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11; + + testElement.innerHTML = ""; + testElementParent.removeChild( testElement ); +})(); + +})(); + +var position = $.ui.position; + + +/*! + * jQuery UI Draggable 1.11.2 + * http://jqueryui.com + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/draggable/ + */ + + +$.widget("ui.draggable", $.ui.mouse, { + version: "1.11.2", + widgetEventPrefix: "drag", + options: { + addClasses: true, + appendTo: "parent", + axis: false, + connectToSortable: false, + containment: false, + cursor: "auto", + cursorAt: false, + grid: false, + handle: false, + helper: "original", + iframeFix: false, + opacity: false, + refreshPositions: false, + revert: false, + revertDuration: 500, + scope: "default", + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + snap: false, + snapMode: "both", + snapTolerance: 20, + stack: false, + zIndex: false, + + // callbacks + drag: null, + start: null, + stop: null + }, + _create: function() { + + if ( this.options.helper === "original" ) { + this._setPositionRelative(); + } + if (this.options.addClasses){ + this.element.addClass("ui-draggable"); + } + if (this.options.disabled){ + this.element.addClass("ui-draggable-disabled"); + } + this._setHandleClassName(); + + this._mouseInit(); + }, + + _setOption: function( key, value ) { + this._super( key, value ); + if ( key === "handle" ) { + this._removeHandleClassName(); + this._setHandleClassName(); + } + }, + + _destroy: function() { + if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) { + this.destroyOnClear = true; + return; + } + this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" ); + this._removeHandleClassName(); + this._mouseDestroy(); + }, + + _mouseCapture: function(event) { + var o = this.options; + + this._blurActiveElement( event ); + + // among others, prevent a drag on a resizable-handle + if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) { + return false; + } + + //Quit if we're not on a valid handle + this.handle = this._getHandle(event); + if (!this.handle) { + return false; + } + + this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix ); + + return true; + + }, + + _blockFrames: function( selector ) { + this.iframeBlocks = this.document.find( selector ).map(function() { + var iframe = $( this ); + + return $( "
" ) + .css( "position", "absolute" ) + .appendTo( iframe.parent() ) + .outerWidth( iframe.outerWidth() ) + .outerHeight( iframe.outerHeight() ) + .offset( iframe.offset() )[ 0 ]; + }); + }, + + _unblockFrames: function() { + if ( this.iframeBlocks ) { + this.iframeBlocks.remove(); + delete this.iframeBlocks; + } + }, + + _blurActiveElement: function( event ) { + var document = this.document[ 0 ]; + + // Only need to blur if the event occurred on the draggable itself, see #10527 + if ( !this.handleElement.is( event.target ) ) { + return; + } + + // support: IE9 + // IE9 throws an "Unspecified error" accessing document.activeElement from an